FreeTDS を使用しているライブラリ (今回は TinyTds) で SQL Database に接続を行おうとして、WSL 上に実行環境を整えたときにちょっとはまったので、メモを残しておきたいと思います。
Ruby から SQL Server ベースの環境に接続する場合には、次のようなドキュメントを参考にすることができます。
- Ruby Driver for SQL Server
- Microsoft SQL Server に対するクライアント プログラミングのホーム ページ
- Build an app using SQL Server
- Connect to Windows Azure SQL Database from Ruby Applications
Ruby から SQL Server ベースの環境に接続する際には TinyTds が標準的な手法かと思います。
TinyTDS は FreeTDS を使用しますので、TinyTds のリポジトリに記載されている次の方法で FreeTDS をインストールを行いました。
$ apt-get install wget $ apt-get install build-essential $ apt-get install libc6-dev $ wget http://www.freetds.org/files/stable/freetds-1.1.24.tar.gz $ tar -xzf freetds-1.1.24.tar.gz $ cd freetds-1.1.24 $ ./configure --prefix=/usr/local --with-tdsver=7.3 $ make $ make install
FreeTDS の make ができれば TinyTds が使用できますので、Ruby で接続を行おうとしたところ、次のようなエラーが発生しました。
Traceback (most recent call last):
3: from main.rb:3:in `<main>’
2: from main.rb:3:in `new’
1: from /var/lib/gems/2.5.0/gems/tiny_tds-2.1.3/lib/tiny_tds/client.rb:60:in `initialize’
/var/lib/gems/2.5.0/gems/tiny_tds-2.1.3/lib/tiny_tds/client.rb:60:in `connect’: Adaptive Server connection failed (xxxxxxxx) (TinyTds::Error)
SQL Server に対しては問題なく接続ができ、SQL Database には接続ができないような状態でした。
FreeTDS の tsql utility が使用で着るようになっていたので、TSQL で接続を行おうとしても同様の事象で接続ができませんでした。
FreeTDS にはロギングの仕組みがあるようですので、
TDSDUMP=/tmp/freetds.log ruby main.rb
で実行してみると、次のようなエラーとなっていました。
net.c:340:tds_setup_socket: connect(2) returned "Operation now in progress"
net.c:528:tds_open_socket() succeededpacket.c:852:Sending packet
packet.c:410:Received packet
login.c:1281:detected crypt flag 3
login.c:571:login packet rejected
query.c:3757:tds_disconnect()
util.c:179:Changed query state from IDLE to DEAD
util.c:333:tdserror(0x55e8a1246ac0, 0x55e8a12475f0, 20002, 0)
dblib.c:8144:dbperror(0x55e8a1248b00, 20002, 0)
dblib.c:8212:dbperror: Calling dblib_err_handler with msgno = 20002; msg->msgtext = "Adaptive Server connection failed (xxxxxxxxx)"
dblib.c:5964:dbgetuserdata(0x55e8a1248b00)
dblib.c:5964:dbgetuserdata(0x55e8a1248b00)
dblib.c:744:dbloginfree(0x55e8a1246b00)
SQL Database への接続ですが、接続できない場合は、次の 3 種類の設定がポイントになるかと思います。
- ファイアウォールの設定
- ログインの指定 (「ログイン名@サーバー名」の形式でも指定を試す)
- 接続の暗号化 (SSL)
「1」「2」に関しては、問題はなかったのですが、今回は「3」が原因となり、接続ができないようでした。
冒頭で紹介した Connect to Windows Azure SQL Database from Ruby Applications や、TinyTDS のドキュメントには次の記載があるのですね。
TinyTDS is fully tested with the Azure platform. You must set the
azure: true
connection option when connecting. This is needed to specify the default database name in the login packet since Azure has no notion ofUSE [database]
. FreeTDS must be compiled with OpenSSL too.
SQL Database に接続する場合は、FreeTDS で OpenSSL を有効にしておく必要があるようでした。
「tsql -C」でOpenSSQL を使用しているかを確認できますが、私が使っている環境は次のようになっていました。
OpenSSL が No になっていますね。
OpenSSL が使用できるようにして、次のコマンドで configure をして、OpenSSL を有効にして make したところ、SQL Database に接続できるようになりました。
./configure --prefix=/usr/local --with-tdsver=7.4 --with-openssl=/usr/bin
慣れない環境だと、ちょっとしたことではまりますね…。