Babelfish のインストール
〜 Microsoft を使わない T-SQL その (1) 〜
2025-12-25 作成 福島
TOP > tips > babelfish
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell ]

0. 前置き

Babelfish (バベルフィッシュ) は、MS SQL ServerTDST-SQLPostgreSQL から
拡張するもので、AWS (Amazon Web Services) が開発・提供しているオープンソースソフトウェアです。
象と魚が一緒のアイコンがトレードマークになっています。
ライセンスを同時にふたつ有しますが、どちらも寛容な規定なので困ることはないでしょう。
名称ライセンス
• BabelfishApache 2.0
• PostgreSQLPostgreSQL
Babelfish の利点はいくつかありますが MS SQL Server にない機能として、接続する IP アドレスを制限することができます。
これだけでも Babelfish を使う理由になるでしょう。
今回の参考はこちら: https://github.com/babelfish-for-postgresql/babelfish-for-postgresql/releases
Babelfish には OSS 版と Amazon Aurora 版の 2 種類が存在し、Amazon Aurora 版はクラウドサービス用で OSS 版に機能が追加されています。

本稿は OSS 版に関する記述です。
できるだけ INSTALL.md に沿って記述したので少し冗長な書き方になっています。
構築環境: LXC にインストールしてるけど、KVM や実機でも同じです。ポート転送はここを参考にしてください。
項目内容備考
OS (LXC)AlmaLinux release 9.7 (Moss Jungle Cat)本稿記述時の最新版は AlmaLinux 10 だが、これを使用すると
ICU のバージョンが新しすぎてコンパイルが失敗する
データベースソフトBabelfish 5.3.0本稿記述時の最新版
バージョンを分けて表記するのは無理があるかもしれない
PostgreSQL 17.6
ANTLR 4.13.2本稿記述時の最新版 (構文木作成ソフト)
クライアントソフト
(確認用)
FreeTDS v1.4.23本稿記述時の最新版
sqlcmd Version 17.10.0001.1 Linux
Amazon Aurora で使用している OS は非公開のため不明です。
(Amazon Linux 2 が rpm を利用していたらしいので RHEL 系だとは思います)


1. 開発環境をインストール

$ su
# dnf update -y
# dnf groupinstall -y "Development Tools"
# dnf install -y 'dnf-command(config-manager)'
# dnf config-manager --set-enabled crb
# dnf install -y \
flex libxml2-devel \
libxslt-devel openssl-devel readline-devel zlib-devel \
openldap-devel gettext libuuid-devel \
cmake lld bison \
libxslt icu libicu-devel gawk \
curl wget openssl \
gcc-c++ python3-devel postgresql-devel \
pkgconf-pkg-config \
gnupg2 unixODBC-devel net-tools unzip \
pam-devel perl-core \
krb5-devel

# dnf install -y java-17-openjdk # RHEL バージョンの違いはたぶんこれ

# exit
$


2. Babelfish のソースを取得 (対応版 PostgreSQL を含む)

$ wget https://github.com/babelfish-for-postgresql/babelfish-for-postgresql/releases/download/BABEL_5_3_0__PG_17_6/BABEL_5_3_0__PG_17_6.tar.gz

$ tar xzf BABEL_5_3_0__PG_17_6.tar.gz


3. 環境変数の設定

3-1. 環境変数を設定する。(全体用)
$ export BABELFISH_HOME=/opt/babelfish/5.3.0 ; \
export PG_CONFIG=${BABELFISH_HOME}/bin/pg_config ; \
export PG_SRC=$(realpath ./BABEL_5_3_0__PG_17_6/)
3-2. 環境変数を設定する。(ANTLR 用)
$ export ANTLR4_VERSION=4.13.2 ; \
export ANTLR4_JAVA_BIN=/usr/bin/java ; \
export ANTLR4_RUNTIME_LIBRARIES=/usr/include/antlr4-runtime ; \
export ANTLR_EXECUTABLE=/usr/local/lib/antlr-${ANTLR4_VERSION}-complete.jar ; \
export ANTLR_RUNTIME=~/antlr4


4. 字句解析・構文解析エンジンを用意する。(ANTLR のオブジェクトから呼ばれる jar)

4-1. ANTLR パーサジェネレータ本体を設置する。
$ sudo cp ${PG_SRC}/contrib/babelfishpg_tsql/antlr/thirdparty/antlr/antlr-${ANTLR4_VERSION}-complete.jar \
/usr/local/lib/

$ java -jar /usr/local/lib/antlr-4.13.2-complete.jar | head
ANTLR Parser Generator  Version 4.13.2
 -o ___              specify output directory where all output is generated
 -lib ___            specify location of grammars, tokens files
 -atn                generate rule augmented transition network diagrams
 -encoding ___       specify grammar file encoding; e.g., euc-jp
 -message-format ___ specify output style for messages in antlr, gnu, vs2005
 -long-messages      show exception details when available for errors and warnings
 -listener           generate parse tree listener (default)
 -no-listener        don't generate parse tree listener
 -visitor            generate parse tree visitor
→ エラーにならないこと。
4-2. Java の調整 (上記 4-1 がエラーになった場合)
新しいバージョンの Java を選択する。

$ sudo alternatives --config java
There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           java-1.8.0-openjdk.x86_64 (…長いので省略…)
*+ 2           java-17-openjdk.x86_64 (…長いので省略…)    ← これを選択  

Enter to keep the current selection[+], or type selection number:2 
*: デフォルトで使用される。
+: 自動で選択された。(手動の場合は表示されない)
4-3. 字句解析・構文解析エンジンをインストールする。
ライブラリ本体 libantlr4-runtime.so(.a) と、これをリンクするためのヘッダ等をインストールする。

$ wget http://www.antlr.org/download/antlr4-cpp-runtime-${ANTLR4_VERSION}-source.zip
$ unzip -d ${ANTLR_RUNTIME} antlr4-cpp-runtime-${ANTLR4_VERSION}-source.zip

$ cd ${ANTLR_RUNTIME}
antlr4$ mkdir -p ./build/ ; cd ./build/
antlr4/build/$ cmake .. -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_DEMO=True \
-D ANTLR_JAR_LOCATION=/usr/local/lib/antlr-${ANTLR4_VERSION}-complete.jar
antlr4/build/$ make
antlr4/build/$ sudo make install
antlr4/build/$ cd ${HOME}
$


5. PostgreSQL をインストールする (Babelfish 対応版)

•PostgreSQL をインストールする。
(RedHat 系は OSSP UUID が提供されていないため、e2fs の UUID を代替使用する)

$ cd ${PG_SRC}
BABEL_5_3_0__PG_17_6/$ ./configure CFLAGS="-ggdb" \
CPPFLAGS=-I/usr/local/include \
LDFLAGS=-L/usr/local/lib \
--prefix=${BABELFISH_HOME}/ \
--enable-debug \
--with-ldap \
--with-libxml \
--with-pam \
--with-uuid=e2fs \
--enable-nls \
--with-libxslt \
--with-icu \
--with-gssapi \
--with-openssl

BABEL_5_3_0__PG_17_6/$ make DESTDIR=${BABELFISH_HOME}/ 2>&1 | tee error.txt
BABEL_5_3_0__PG_17_6/$ sudo make install
BABEL_5_3_0__PG_17_6/$ cd ${HOME}
$


6. 拡張ライブラリのインストール

$ cd ${PG_SRC}/contrib
BABEL_5_3_0__PG_17_6/contrib/$ make
BABEL_5_3_0__PG_17_6/contrib/$ sudo make install
BABEL_5_3_0__PG_17_6/contrib/$ cd ${HOME}
$


7. ANTLR のコンパイル (T-SQL 用)

$ export cmake=$(which cmake)
$ sudo cp /usr/local/lib64/libantlr4-runtime.so ${BABELFISH_HOME}/lib/
$ cd ${PG_SRC}/contrib/babelfishpg_tsql/antlr/
BABEL_5_3_0__PG_17_6/contrib/babelfishpg_tsql/antlr/$ cmake -Wno-dev .
BABEL_5_3_0__PG_17_6/contrib/babelfishpg_tsql/antlr/$ make all
BABEL_5_3_0__PG_17_6/contrib/babelfishpg_tsql/antlr/$ cd ${HOME}
$


8. 貢献モジュールのインストール

$ cd ${PG_SRC}/contrib/

BABEL_5_3_0__PG_17_6/contrib/$ for ext in babelfishpg_common \
  babelfishpg_money \
  babelfishpg_tds \
  babelfishpg_tsql
do
  cd $ext
  make
  sudo make PG_CONFIG=${PG_CONFIG} install
  cd ..
done

BABEL_5_3_0__PG_17_6/contrib/$ cd ${HOME}
$


9. PostgreSQL の設定 (Babelfish 版)

9-1. ユーザ postgres を作成する。
$ su
# mkdir -p /var/lib/babelfish/5.3.0/

# adduser postgres --home /var/lib/babelfish/
1 行前でディレクトリを作っているからエラーが表示される…。
adduser: warning: the home directory /var/lib/babelfish/ already exists.
adduser: Not copying any file from skel directory into it.
# chown -R postgres: /opt/babelfish/
# chown -R postgres: /var/lib/babelfish/
# exit
$
9-2. データベースを初期化する。
9-2-1. 初期化用の環境変数を定義する。
$ su
# su - postgres
$ cat >> ~/.bash_profile << EOF
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
EOF

$ cat >> ~/.bashrc << EOF
export BABELFISH_HOME=/opt/babelfish/5.3.0
export BABELFISH_DATA=/var/lib/babelfish/5.3.0/data
EOF

$ . ~/.bashrc

この ~/.bashrc は次回のログインから有効になる。
なので、ここで強制的に読み込んでいる。
9-2-2. PostgreSQL の環境を初期化する。
$ ${BABELFISH_HOME}/bin/initdb -D ${BABELFISH_DATA}/ -E "UTF8"
9-2-3. PostgreSQL の設定に Babelfish を追加する。
$ cat -n ${BABELFISH_DATA}/postgresql.conf | tail -4
   839  # CUSTOMIZED OPTIONS
   840  #------------------------------------------------------------------------------
   841  
   842  # Add settings for extensions here
$ cat << EOF >> ${BABELFISH_DATA}/postgresql.conf
#------------------------------------------------------------------------------
# BABELFISH RELATED OPTIONS
# These are going to step over previous duplicated variables.
#------------------------------------------------------------------------------
listen_addresses = '*'
allow_system_table_mods = on
shared_preload_libraries = 'babelfishpg_tds'
babelfishpg_tds.listen_addresses = '*'
EOF

$ cat -n ${BABELFISH_DATA}/postgresql.conf | tail -12
   839  # CUSTOMIZED OPTIONS
   840  #------------------------------------------------------------------------------
   841  
   842  # Add settings for extensions here
   843  #------------------------------------------------------------------------------
   844  # BABELFISH RELATED OPTIONS
   845  # These are going to step over previous duplicated variables.
   846  #------------------------------------------------------------------------------
   847  listen_addresses = '*'
   848  allow_system_table_mods = on
   849  shared_preload_libraries = 'babelfishpg_tds'
   850  babelfishpg_tds.listen_addresses = '*'
9-2-4. インスタンスを起動する。
$ ${BABELFISH_HOME}/bin/pg_ctl -D ${BABELFISH_DATA}/ -l logfile start
waiting for server to start.... done
server started
$ cat ./logfile
2025-11-21 16:26:49.105 JST [37273] LOG: starting PostgreSQL 17.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-11), 64-bit
2025-11-21 16:26:49.106 JST [37273] LOG: listening on IPv4 address "0.0.0.0", port 5432
2025-11-21 16:26:49.106 JST [37273] LOG: listening on IPv6 address "::", port 5432
2025-11-21 16:26:49.111 JST [37273] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2025-11-21 16:26:49.114 JST [37273] LOG: listening on IPv4 address "0.0.0.0", port 1433
2025-11-21 16:26:49.114 JST [37273] LOG: listening on unrecognized address family 10 address "::", port 1433
2025-11-21 16:26:49.123 JST [37276] LOG: database system was shut down at 2025-11-21 16:25:55 JST
2025-11-21 16:26:49.131 JST [37273] LOG: database system is ready to accept connections
9-2-5. Dababase の拡張機能を有効にする
9-2-5-1. ANTLR を参照可能にする。
$ bash # シンボリックリンクを相対にしたいのでシェルを起動する
$ cd ${BABELFISH_HOME}/lib/
/opt/babelfish/5.3.0/lib/$ ln -s libantlr4-runtime.so libantlr4-runtime.so.4.13.2
/opt/babelfish/5.3.0/lib/$ exit

$ export LD_LIBRARY_PATH=${BABELFISH_HOME}/lib:$LD_LIBRARY_PATH
$ ldd ${BABELFISH_HOME}/lib/postgresql/babelfishpg_tsql.so | grep "not found"
 …リンク切れ (not found) が無ければ OK…
9-2-5-2. PostgreSQL に babelfish_db を作成する。
•ユーザ babelfish_user (Super User) を作成し、これをオーナにしてデータベース babelfish_db を作成する。

$ ${BABELFISH_HOME}/bin/psql -d postgres -U postgres \
-c "CREATE USER babelfish_user WITH SUPERUSER CREATEDB CREATEROLE PASSWORD '12345678' INHERIT;"

$ ${BABELFISH_HOME}/bin/psql -d postgres -U postgres -c "DROP DATABASE IF EXISTS babelfish_db;"

$ ${BABELFISH_HOME}/bin/psql -d postgres -U postgres -c "CREATE DATABASE babelfish_db OWNER babelfish_user;"
9-2-5-3. babelfish_db に対して拡張モジュール babelfishpg_tds (TDS サーバ) と依存モジュールを追加する。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \
-c "CREATE EXTENSION IF NOT EXISTS "babelfishpg_tds" CASCADE;"
9-2-5-4. babelfish_db に対して babelfish_user へシステムスキーマのアクセスとデータベース作成の権限を付与する。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "GRANT ALL ON SCHEMA sys to babelfish_user;"

$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "ALTER USER babelfish_user CREATEDB;"
9-2-5-5. T-SQL のデフォルト DB と動作モードを指定する。
•デフォルト DB を babelfish_db に割り当てる。

•複数のデータベースを操作可能にする。(CREATE / DROP database)
 - 推奨マイグレーションモード: multi-db (MS SQL Server で言う「インスタンス」)
 - データベースを初期化した後は変更できない。
 - マイグレーションモードを変更するには新規にデータベースを作成する。

(下記 ALTER 操作において -d babelfish_db の指定は無駄だと思うが、手順に従う)

$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \
-c "ALTER SYSTEM SET babelfishpg_tsql.database_name = 'babelfish_db';"

$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \
-c "ALTER SYSTEM SET babelfishpg_tsql.migration_mode = 'multi-db';"
9-2-5-6. 動作モードを反映させる。
•変更前の動作モードを確認する。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \
-c "SELECT current_setting('babelfishpg_tsql.database_name'), current_setting('babelfishpg_tsql.migration_mode');"
 current_setting | current_setting
-----------------+-----------------
 babelfish_db    | single-db
(1 row)
•動作モードを反映させる。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "SELECT pg_reload_conf();"

•変更後の動作モードを確認する。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \
-c "SELECT current_setting('babelfishpg_tsql.database_name'), current_setting('babelfishpg_tsql.migration_mode');"
 current_setting | current_setting
-----------------+-----------------
 babelfish_db    | multi-db
(1 row)

Note: migration_mode を指定しない場合、Babelfish はデフォルト値として single-db で初期化する。
初期化後にマイグレーションモードは変更できない。その時は新しいクラスタの作成が必要になる。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \
-c "ALTER SYSTEM SET babelfishpg_tsql.migration_mode = 'single-db';"
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "SELECT pg_reload_conf();"
9-2-6. データベースを初期化する。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "CALL sys.initialize_babelfish('babelfish_user');"
$ exit
# exit
$


10. TDS と T-SQL で起動確認

10-1. FreeTDS で起動確認する。
10-1-1. FreeTDS をインストールする。
$ su
# dnf install -y epel-release
# dnf install -y freetds
# exit
$
10-1-2. TSQL で接続する。
$ tsql -H localhost -U babelfish_user -p 1433 -P '12345678' -D tempdb
locale is "C.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Setting tempdb as default database in login packet
Changed database context to 'tempdb'.
1> SELECT @@VERSION 
2> GO 
version
Babelfish for PostgreSQL with SQL Server Compatibility - 12.0.2000.8  
...
Copyright (c) Amazon Web Services
PostgreSQL 17.6 Babelfish for PostgreSQL on x86_64-pc-linux-gnu
(1 row affected)
---
1> exit 

1 行で実行するには以下のようにする。
$ printf 'SELECT @@VERSION;\nGO\n' | tsql -H localhost -U babelfish_user -p 1433 -P '12345678' -D tempdb
10-2. sqlcmd で起動確認する。
10-2-1. sqlcmd をインストールする。
ここを参考にして sqlcmd をインストールする。
10-2-2. sqlcmd で接続する。
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb
1> SELECT @@VERSION 
2> GO 
version                                                               
----------------------------------------------------------------------
Babelfish for PostgreSQL with SQL Server Compatibility - 12.0.2000.8
Nov 21 2025 16:22:41
Copyright (c) Amazon Web Services
PostgreSQL 17.6 on x86_64-pc-linux-gnu (Babelfish 5.3.0)              

(1 rows affected)
1> exit 

1 行で実行するには以下のようにする。
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb -Q 'SELECT @@VERSION'


11. 自動起動の設定

11-1. 初期化に使用した Babelfish を停止する。
$ su
# bash
# cd /var/lib/babelfish/5.3.0/data/
/var/lib/babelfish/5.3.0/data/# if [ -f postmaster.pid ]; then kill `head -1 ./postmaster.pid`; fi
/var/lib/babelfish/5.3.0/data/# exit
#
11-2. サービスファイルを作成・登録する。
• systemd では環境変数を展開できないため、引数のディレクトリは直接に指定する。

# cat > /etc/systemd/system/babelfish.service << EOF
[Unit]
Description=Babelfish for PostgreSQL
After=network.target

[Service]
Type=forking
User=postgres
Group=postgres

 ExecStart=/opt/babelfish/5.3.0/bin/pg_ctl -D /var/lib/babelfish/5.3.0/data/ -l /var/lib/babelfish/5.3.0/data/logfile start
  ExecStop=/opt/babelfish/5.3.0/bin/pg_ctl -D /var/lib/babelfish/5.3.0/data/ stop
ExecReload=/opt/babelfish/5.3.0/bin/pg_ctl -D /var/lib/babelfish/5.3.0/data/ reload

#TimeoutSec=300

[Install]
WantedBy=multi-user.target
EOF

# systemctl enable babelfish
11-3. Babelfish (PostgreSQL) を起動する。
# systemctl start babelfish

# exit
$


12. pgSQL ではなく T-SQL であることの確認

T-SQL と pgSQL で挙動が異なる同一の SQL を実行し、どちらが動作しているか確認する。
SELECT ARRAY[1,2,3];

• T-SQL (Babelfish) → エラー
• pgSQL (PostgreSQL) → 正常

• T-SQL ではエラーになるはず。
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb -Q 'SELECT ARRAY[1,2,3];'
Msg 33557097, Level 16, State 1, Server BABELFISH, Line 1
column "array" does not exist
ちゃんとエラーになった。
• pgSQL では正常に実行される。
$ su
# su - postgres
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c 'SELECT ARRAY[1,2,3];'
  array
---------
 {1,2,3}
(1 row)
エラーにならない。
$ exit
$ exit
$


13. T-SQL の動作確認

元ネタはここのファイル。(example_data.sql)
接続するデータベースが明記されていないので tempdb に接続している。
(tempdb は MS SQL Server / Babelfish で自動作成されるテータベースの一つ。制限がある)

13-1. T-SQL を実行する。
ここでは tempdb に 2 つのテーブル example_db.authors, example_db.books を作成している。
(右側のコメントは pgSQL での書式)

$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb << EOF
-- Create example_db schema
CREATE SCHEMA example_db;
GO

DROP TABLE IF EXISTS example_db.books;
DROP TABLE IF EXISTS example_db.authors;

-- Create tables
CREATE TABLE example_db.authors (
  author_id INT IDENTITY PRIMARY KEY,  --pgSQL-> author_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  [name] NVARCHAR (MAX) NOT NULL,      --pgSQL-> "name" TEXT NOT NULL
);                                     --pgSQL-> 後端項目でコンマは付けない

CREATE TABLE example_db.books (
  book_id INT IDENTITY PRIMARY KEY,    --pgSQL-> book_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  title NVARCHAR (MAX) NOT NULL,       --pgSQL-> title TEXT NOT NULL,
  author_id INT NOT NULL,
  publish_date DATETIME2 NOT NULL,     --pgSQL-> publish_date TIMESTAMP NOT NULL,
  price MONEY NOT NULL,
  FOREIGN KEY (author_id) REFERENCES example_db.authors (author_id) ON DELETE CASCADE ON UPDATE CASCADE
);
GO

-- Seed tables
INSERT INTO example_db.authors ([name]) VALUES  --pgSQL-> INSERT INTO example_db.authors ("name") VALUES
  ('Kristin Hannah'),
  ('Andy Weir');

INSERT INTO example_db.books (title, author_id, publish_date, price) VALUES
  ('The Four Winds',    1, '02-02-2021 00:00:00', 14.99),
  ('The Nightingale',   1, '02-03-2015 00:00:00', 11.99),
  ('Project Hail Mary', 2, '05-04-2021 00:00:00', 14.99),
  ('Artemis',           2, '11-14-2017 00:00:00',  8.99),
  ('The Martian',       2, '02-11-2014 00:00:00',  8.99);
GO
EOF
13-2. 内容を確認する。
雑なクエリだが DB の動作を確認するだけなので、これで良しとする。

$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb \
-Q "SELECT * FROM example_db.authors, example_db.books;"
author_id   name             book_id    title                       author_id   publish_date                  price
----------- ---------------- ---------- --------------------------- ----------- ----------------------------- ----------- 
          1 Kristin Hannah            1 The Four Winds                        1 2021-02-02 00:00:00.0000000       14.9900
          1 Kristin Hannah            2 The Nightingale                       1 2015-02-03 00:00:00.0000000       11.9900
          1 Kristin Hannah            3 Project Hail Mary                     2 2021-05-04 00:00:00.0000000       14.9900
          1 Kristin Hannah            4 Artemis                               2 2017-11-14 00:00:00.0000000        8.9900
          1 Kristin Hannah            5 The Martian                           2 2014-02-11 00:00:00.0000000        8.9900
          2 Andy Weir                 1 The Four Winds                        1 2021-02-02 00:00:00.0000000       14.9900
          2 Andy Weir                 2 The Nightingale                       1 2015-02-03 00:00:00.0000000       11.9900
          2 Andy Weir                 3 Project Hail Mary                     2 2021-05-04 00:00:00.0000000       14.9900
          2 Andy Weir                 4 Artemis                               2 2017-11-14 00:00:00.0000000        8.9900
          2 Andy Weir                 5 The Martian                           2 2014-02-11 00:00:00.0000000        8.9900

(10 rows affected)

 SSMS (Windows) で操作することも可能だが、v18.12.1 より新しいバージョンでは操作できない。
 左は SSMS v18.12.1 の様子。

DBeaver 25.3.0 なら問題なく操作可能。

13-3. 動作確認で使用したスキーマを削除する。
MS SQL Server の tempdb は再起動すると消える仕様だが、Babelfish の tempdb は再起動しても消えない。
一時的なスキーマ・テーブルは手動で削除する。

テーブルを削除する。
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb -Q "DROP TABLE example_db.books;"
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb -Q "DROP TABLE example_db.authors;"

スキーマを削除する。
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb -Q "DROP SCHEMA example_db;"

スキーマが無くなっていることを確認する。
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -d tempdb -Q "SELECT name FROM sys.schemas;"


14. 通信路暗号化の対応

Babelfish (というか PostgreSQL) は通信路の暗号化に TLS を使うが、このために証明書が必要になる。
ここでは自己証明書を作成する。

14-1. 暗号化されていないことを確認する。
sqlcmd で暗号化接続の失敗と、平文接続の成功を確認する。
FreeTDS には証明書の検証を簡単にスキップする機能が無いため、下記 14-5 で暗号化の確認ができない。

$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -N -C \
-Q "SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID"
暗号化は未設定なので失敗するのが正解。
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Encryption not supported on SQL Server..
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.
$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' \
-Q "SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID"
平文は普通に接続できる。
encrypt_option
----------------------------------------
FALSE

(1 rows affected)
14-2. 自己証明書を作成する。
$ su
# su - postgres
$ cd ${BABELFISH_DATA}/
/var/lib/babelfish/5.3.0/data/$ openssl genrsa -out server.key 2048
/var/lib/babelfish/5.3.0/data/$ chmod 600 server.key
/var/lib/babelfish/5.3.0/data/$ openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]: 
State or Province Name (full name) []: 
Locality Name (eg, city) [Default City]: 
Organization Name (eg, company) [Default Company Ltd]: 
Organizational Unit Name (eg, section) []: 
Common Name (eg, your name or your server's hostname) []: 
Email Address []: 
どうせ自己証明書だから情報はすべて空。
/var/lib/babelfish/5.3.0/data/$ ls -l server.*
-rw-r--r--. 1 postgres postgres 1237 Nov 21 22:42 server.crt 
-rw-------. 1 postgres postgres 1704 Nov 21 22:41 server.key
14-3. PostgreSQL の設定に暗号化を指定する。
/var/lib/babelfish/5.3.0/data/$ vim postgresql.conf
    ………
# - SSL -

ssl = on
#ssl_ca_file = ''
ssl_cert_file = 'server.crt'
#ssl_crl_file = ''
#ssl_crl_dir = ''
ssl_key_file = 'server.key'
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'       # allowed SSL ciphers
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve = 'prime256v1'
#ssl_min_protocol_version = 'TLSv1.2'
#ssl_max_protocol_version = ''
#ssl_dh_params_file = ''
#ssl_passphrase_command = ''
#ssl_passphrase_command_supports_reload = off

    ………
listen_addresses = '*'
allow_system_table_mods = on
shared_preload_libraries = 'babelfishpg_tds'
babelfishpg_tds.listen_addresses = '*'
babelfishpg_tds.tds_ssl_encrypt = on
    ………
/var/lib/babelfish/5.3.0/data/$ exit
14-4. Babelfish (PostgreSQL) を再起動する。
# systemctl stop babelfish
# systemctl start babelfish
# exit
$
14-5. 暗号化されていることを確認する。
当然だが、自己証明書には CA が存在しないため検証が必ず失敗する。

オプション -N -C に注意。
(v18 以降の場合は -Nm -C)

$ sqlcmd -S localhost,1433 -U babelfish_user -P '12345678' -N -C \
-Q "SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID"
暗号化接続もできるようになった。
encrypt_option
----------------------------------------
TRUE

(1 rows affected)


15. ファイアウォールの調整と接続許可の設定

15-1. TDS ポートを許可する。
TDS はポート 1433 が標準。

$ su
# firewall-cmd --zone=public --add-port=1433/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-ports
1433/tcp
ポート 1433 が許可された。
# exit
$
15-2. 接続を許可する IP アドレスを指定する。
接続の許可は PostgreSQL の機能を使用する。

$ su
# su - postgres
$ vim /var/lib/babelfish/5.3.0/data/pg_hba.conf
ここでは IP アドレス 192.168.11.1 ~ 254 を接続可能としている。
    ………
# TYPE  DATABASE        USER        ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   all             all                             trust
# IPv4 local connections:
host    all             all         127.0.0.1/32        trust
host    all             all         192.168.11.0/24     trust # この行を追加 
# IPv6 local connections:
host    all             all         ::1/128             trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                             trust
host    replication     all         127.0.0.1/32        trust
host    replication     all         ::1/128             trust
    ………
$ exit

• PostgreSQL の設定を変更したので再起動する。
# systemctl restart babelfish
# exit
$
15-3. Windows PC から動作確認する。
− □ × 
 >_ Windows PowerShell ×   + |
 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows  

PS C:\> sqlcmd -S 192.168.11.11,1433 -U babelfish_user -P "12345678" -Nm -C -Q "
SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID" 
encrypt_option
----------------------------------------
TRUE

(1 行処理されました)

PS C:\> exit