刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

unixODBCからMS版ODBCドライバでSQLServer2019に接続する

UbuntuSQL Server on Linux の導入時にコマンドラインツールを導入すると、Microsoft 版の ODBCドライバもインストールされます。

unixodbc-dev パッケージも同時にインストールするし、せっかくなのでこの環境のまま、SQL Server に接続してみました。

1. 環境

  • Ubuntu Desktop 18.04.4 LTS 日本語Remix (Linux Kernel 5.3.0-28-generic)
  • SQL Server 2019 (RTM-CU1) (KB4527376) - 15.0.4003.23 (X64) on Linux
  • mssql-tools unixodbc-dev パッケージは導入済み

2. unixODBC の確認

(1) コマンドの所在

unixODBC のコマンドラインツールの所在を確認します。

$ which isql
/usr/bin/isql
$ which odbcinst
/usr/bin/odbcinst
(2) バージョン確認
$ isql --version
unixODBC 2.3.7
$ odbcinst --version
unixODBC 2.3.7

ソースからビルドしたり、他データベースのパッケージを導入したりすると、場合によっては矛盾や衝突してる可能性もあるので、念の為の確認です。

(3) unixODBC の構成情報
$ odbcinst -j
unixODBC 2.3.7
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/dareka/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
(4) ODBC ドライバの登録状況
$ odbcinst -q -d
[ODBC Driver 17 for SQL Server]
$ cat /etc/odbcinst.ini 
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.1.1
UsageCount=1

現在の ODBC ドライバのバージョンは 17.5 のようです。

(5) データソースの登録状況

1) ユーザ DSN の一覧

$ odbcinst -q -s
odbcinst: SQLGetPrivateProfileString failed with .

2) システム DSN の一覧

$ odbcinst -q -s -l
odbcinst: SQLGetPrivateProfileString failed with .

どちらも「空っぽ」です。

2. isql から DSN-less で接続する

isqlコマンドの-kオプションで "接続文字列" を指定すると、DSN 指定なしで接続できます。

$ isql -v -k "DRIVER={ODBC Driver 17 for SQL Server};Server=localhost;UID=sa;PWD=abcd1234$;Database=NorthwindJ"
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select cast(氏名 as nvarchar) as 'Name' from 社員
+-------------------------------+
| Name                          |
+-------------------------------+
| 加藤 泰江                 |
| 葛城 孝史                 |
| 山本 雅治                 |
| 小川 さよ子              |
| 松沢 誠一                 |
| 森上 偉久馬              |
| 成宮 真紀                 |
| 青木 俊之                 |
| 川村 匡                    |
+-------------------------------+
SQLRowCount returns 0
9 rows fetched
SQL> quit
$

sqlcmd と同様にクエリを実行できました。

3. isql から DSN を指定して接続する

やっぱり常用するなら、DSN 指定の方が良いんでしょうか。

(1) データソースのテンプレートを用意

エディタで dsn_northwindj.template を作成します。

[NorthwindJ]
Driver = ODBC Driver 17 for SQL Server
Description = NorthwindJ sample database
Trace = No
Encrypt = No
TrustServerCertificate = No
Server = localhost
Database = NorthwindJ

※ UID と PWD は記述しないで!登録時ではなく、接続時にエラーが発生します。

(2) データソースを登録する

次の (2-a) と (2-b) どちらかの方法で、dsn_northwindj.template をテータソースに登録して、DSN を利用できるようにします。

(2-a) ユーザデータソースのみ登録

$ odbcinst -i -s -f dsn_northwindj.template 
$ odbcinst -q -s 
[NorthwindJ]
$ odbcinst -q -s -l
odbcinst: SQLGetPrivateProfileString failed with .

(2-b) ユーザデータソースとシステムデータソースに登録

システムデータソースに登録する場合は root 権限が必要です。

$ sudo odbcinst -i -s -l -f dsn_northwindj.template 
$ odbcinst -q -s 
[NorthwindJ]
$ odbcinst -q -s -l
[NorthwindJ]
(3) DSN を指定してデータベースに接続

isql -v [データソース名] [ユーザID] [パスワード]で接続します。

$ isql -v NorthwindJ sa abcd1234$
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select cast(氏名 as nvarchar) as 'Name' from 社員
〜(ざっくり省略)〜

こちらも同様にクエリを実行できました。

4. 補足

これで unixODBC から MS 版 ODBC ドライバ経由での接続が確認できました。
ずっと FreeTDS のお世話になってましたが、MS 版 ODBC ドライバで運用してみようと思います。

(1) 参考: DSNの削除

データソースが不要になったら、データソース名を指定して削除します。

(a) 前述の (2-a) の手順でデータソースを登録した場合

$ odbcinst -u -s -n NorthwindJ
odbcinst: DSN removed (if it existed at all). ODBC_BOTH_DSN was used as the search path.

(b) 前述の (2-b) の手順でデータソースを登録した場合

システムデータソースから削除する場合は root 権限が必要です。

$ sudo odbcinst -u -s -l -n NorthwindJ
odbcinst: DSN removed (if it existed at all). ODBC_SYSTEM_DSN was used as the search path.
(2) 参考にしたサイト