unixODBCからMS版ODBCドライバでSQLServer2019に接続する
Ubuntu で SQL 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) 参考にしたサイト
- Microsoft ODBC Driver for SQL Server - SQL Server | Microsoft Docs
- ODBC | Mono
- Using isql with a Connection String