SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

FreeTDS で SQL Database に接続を行う

leave a comment

FreeTDS を使用しているライブラリ (今回は TinyTds) で SQL Database に接続を行おうとして、WSL 上に実行環境を整えたときにちょっとはまったので、メモを残しておきたいと思います。

Ruby から SQL Server ベースの環境に接続する場合には、次のようなドキュメントを参考にすることができます。

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() succeeded

packet.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 種類の設定がポイントになるかと思います。

  1. ファイアウォールの設定
  2. ログインの指定 (「ログイン名@サーバー名」の形式でも指定を試す)
  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 of USE [database]. FreeTDS must be compiled with OpenSSL too.

 

SQL Database に接続する場合は、FreeTDS で OpenSSL を有効にしておく必要があるようでした。

「tsql -C」でOpenSSQL を使用しているかを確認できますが、私が使っている環境は次のようになっていました。

image

OpenSSL が No になっていますね。

OpenSSL が使用できるようにして、次のコマンドで configure をして、OpenSSL を有効にして make したところ、SQL Database に接続できるようになりました。

 ./configure --prefix=/usr/local --with-tdsver=7.4 --with-openssl=/usr/bin 

 

image

慣れない環境だと、ちょっとしたことではまりますね…。

Share

Written by Masayuki.Ozawa

2月 20th, 2021 at 4:42 pm

Leave a Reply