0. 前置き
Babelfish (バベルフィッシュ) は、MS SQL Server の TDS と T-SQL を PostgreSQL から
拡張するもので、AWS (Amazon Web Services) が開発・提供しているオープンソースソフトウェアです。
象と魚が一緒のアイコンがトレードマークになっています。
ライセンスを同時にふたつ有しますが、どちらも寛容な規定なので困ることはないでしょう。
Babelfish の利点はいくつかありますが MS SQL Server にない機能として、接続する IP アドレスを制限することができます。
名称 ライセンス • Babelfish Apache 2.0 • PostgreSQL PostgreSQL
これだけでも Babelfish を使う理由になるでしょう。
今回の参考はこちら: https://github.com/babelfish-for-postgresql/babelfish-for-postgresql/releases
- MS SQL Server の完全互換ではありません。(まだ) 使えない機能がいくつかあります。
- SSMS で閲覧することも出来ますが、SSMS からバックアップ等の機能は使用できません。
- 識別子に漢字 (Unicode) を使用できません。将来的にサポートされるかどうかも分かりません。
Babelfish には OSS 版と Amazon Aurora 版の 2 種類が存在し、Amazon Aurora 版はクラウドサービス用で OSS 版に機能が追加されています。
本稿は OSS 版に関する記述です。
できるだけ INSTALL.md に沿って記述したので少し冗長な書き方になっています。
構築環境: LXC にインストールしてるけど、KVM や実機でも同じです。ポート転送はここを参考にしてください。
Amazon Aurora で使用している OS は非公開のため不明です。
項目 内容 備考 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 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 ; \3-2. 環境変数を設定する。(ANTLR 用)
export PG_CONFIG=${BABELFISH_HOME}/bin/pg_config ; \
export PG_SRC=$(realpath ./BABEL_5_3_0__PG_17_6/)
$ 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 \4-2. Java の調整 (上記 4-1 がエラーになった場合)
/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
新しいバージョンの Java を選択する。4-3. 字句解析・構文解析エンジンをインストールする。
$ 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 ⏎
+: 自動で選択された。(手動の場合は表示されない)
ライブラリ本体 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 を作成する。
$ su9-2. データベースを初期化する。
# mkdir -p /var/lib/babelfish/5.3.0/
# adduser postgres --home /var/lib/babelfish/
1 行前でディレクトリを作っているからエラーが表示される…。# chown -R postgres: /opt/babelfish/
adduser: warning: the home directory /var/lib/babelfish/ already exists. adduser: Not copying any file from skel directory into it.
# chown -R postgres: /var/lib/babelfish/
# exit
$
9-2-1. 初期化用の環境変数を定義する。
$ su9-2-2. PostgreSQL の環境を初期化する。
# 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 は次回のログインから有効になる。
なので、ここで強制的に読み込んでいる。
$ ${BABELFISH_HOME}/bin/initdb -D ${BABELFISH_DATA}/ -E "UTF8"9-2-3. PostgreSQL の設定に Babelfish を追加する。
$ cat -n ${BABELFISH_DATA}/postgresql.conf | tail -49-2-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 = '*'
$ ${BABELFISH_HOME}/bin/pg_ctl -D ${BABELFISH_DATA}/ -l logfile start9-2-5. Dababase の拡張機能を有効にする
$ cat ./logfile
waiting for server to start.... done server started
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-1. ANTLR を参照可能にする。9-2-6. データベースを初期化する。
$ bash # シンボリックリンクを相対にしたいのでシェルを起動する9-2-5-2. PostgreSQL に babelfish_db を作成する。
$ 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…
•ユーザ babelfish_user (Super User) を作成し、これをオーナにしてデータベース babelfish_db を作成する。9-2-5-3. babelfish_db に対して拡張モジュール babelfishpg_tds (TDS サーバ) と依存モジュールを追加する。
$ ${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;"
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres \9-2-5-4. babelfish_db に対して babelfish_user へシステムスキーマのアクセスとデータベース作成の権限を付与する。
-c "CREATE EXTENSION IF NOT EXISTS "babelfishpg_tds" CASCADE;"
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "GRANT ALL ON SCHEMA sys to babelfish_user;"9-2-5-5. T-SQL のデフォルト DB と動作モードを指定する。
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c "ALTER USER babelfish_user CREATEDB;"
•デフォルト DB を babelfish_db に割り当てる。9-2-5-6. 動作モードを反映させる。
•複数のデータベースを操作可能にする。(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';"
•変更前の動作モードを確認する。
$ ${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();"
$ ${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 をインストールする。10-2. sqlcmd で起動確認する。
$ su10-1-2. TSQL で接続する。
# dnf install -y epel-release
# dnf install -y freetds
# exit
$
$ 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-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 を停止する。
$ su11-2. サービスファイルを作成・登録する。
# 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
#
• systemd では環境変数を展開できないため、引数のディレクトリは直接に指定する。11-3. Babelfish (PostgreSQL) を起動する。
# 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
# 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];'
• pgSQL では正常に実行される。ちゃんとエラーになった。
Msg 33557097, Level 16, State 1, Server BABELFISH, Line 1 column "array" does not exist
$ su
# su - postgres
$ ${BABELFISH_HOME}/bin/psql -d babelfish_db -U postgres -c 'SELECT ARRAY[1,2,3];'
$ exitエラーにならない。
array --------- {1,2,3} (1 row)
$ 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 を作成している。13-2. 内容を確認する。
(右側のコメントは 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
雑なクエリだが DB の動作を確認するだけなので、これで良しとする。13-3. 動作確認で使用したスキーマを削除する。
$ 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 なら問題なく操作可能。
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 で暗号化接続の失敗と、平文接続の成功を確認する。14-2. 自己証明書を作成する。
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 -S localhost,1433 -U babelfish_user -P '12345678' \
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.
-Q "SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID"
平文は普通に接続できる。
encrypt_option ---------------------------------------- FALSE (1 rows affected)
$ su14-3. PostgreSQL の設定に暗号化を指定する。
# 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
/var/lib/babelfish/5.3.0/data/$ ls -l server.*どうせ自己証明書だから情報はすべて空。
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 []: ⏎
-rw-r--r--. 1 postgres postgres 1237 Nov 21 22:42 server.crt -rw-------. 1 postgres postgres 1704 Nov 21 22:41 server.key
/var/lib/babelfish/5.3.0/data/$ vim postgresql.conf14-4. Babelfish (PostgreSQL) を再起動する。
/var/lib/babelfish/5.3.0/data/$ exit
……… # - 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 ………
# systemctl stop babelfish14-5. 暗号化されていることを確認する。
# systemctl start babelfish
# exit
$
当然だが、自己証明書には 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 が標準。15-2. 接続を許可する IP アドレスを指定する。
$ su
# firewall-cmd --zone=public --add-port=1433/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-ports
# exitポート 1433 が許可された。
1433/tcp
$
接続の許可は PostgreSQL の機能を使用する。15-3. Windows PC から動作確認する。
$ su
# su - postgres
$ vim /var/lib/babelfish/5.3.0/data/pg_hba.conf
ここでは IP アドレス 192.168.11.1 ~ 254 を接続可能としている。$ exit
……… # 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 ………
• PostgreSQL の設定を変更したので再起動する。
# systemctl restart babelfish
# exit
$
− □ × >_ 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 ⏎