Linuxクライアントマシンから、windowsマシン(ホスト名:FM)のMS SQLServerを操作してみる。

方法としてはjdbcによる方法の他に、Microsoft様から提供されているLinux向けodbcドライバを使う方法があるそうな。
ここではそのMicrosoft様の「Microsoft ODBC Driver for SQL Server on Linux」を使った方法を記す。
https://msdn.microsoft.com/ja-jp/library/hh568451(v=sql.1).aspx
*ただし、ダウンロード先のリンクは切れてるようで、下記URLから入手可能
https://www.microsoft.com/en-us/download/details.aspx?id=36437

Windows向けのクライアントツール

道筋

Linuxマシンに対して、大きく2つの作業がある

  • Microsoft ODBC Driverのインストール
    CentOS7の場合はmsodbcsql-13.0.0.0.tar.gz、CentOS6の場合はmsodbcsql-11.0.2270.0.tar.gz
    インストールされたlinuxコマンド「sqlcmd」でSQLServerの操作は可能となる
  • unixODBC Driver Managerのインストール

odbcドライバがインストールによりphpからSQLServerを操作することも可能となる。
*その際、「php-odbc」パッケージが必要になる

unixODBC Driver Managerのインストール

本家様 http://www.unixodbc.org/
unixODBCの最新版は 2.3.4(2016.06時点) であるが、Microsoft様のMicrosoft ODBC Driverの要件を調べると
CentOS 7向けのmsodbcsql-13.0.0.0では unixODBC-2.3.1 が必要。
幸い、yumでインストールされる unixODBC も 2.3.1 なので、そのまま使います。

[root@c ~]# yum install unixODBC

windowsで言うところの「ODBCデータソースアドミニストレータ」な感じで、設定ファイル/etc/odbcinst.iniは、
差し詰め「ドライバー」っぽい

[root@c ~]# cat /etc/odbcinst.ini
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1
 
[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1
[root@c ~]#

2016y06m26d_015251943.png
この/etc/odbcinst.iniに下記のMicrosoft ODBC Driverが登録されます。

留意
ちなみに、CentOS6の場合、msodbcsql-11.0.2270.0 で必要とされる unixODBC のバージョンは unixODBC-2.3.0 である。
しかしCentOS6のyumで提供される unixODBC は 2.2.14 なので、ソースの入手とコンパイルが必要となります。
参照MSSQL/クライアント/CentOS6

Microsoft ODBC Driverのインストール

Microsoft ODBC Driverは microsoft より提供されてます。
*https://www.microsoft.com/en-us/download/details.aspx?id=36437にて入手可能

ここではCentOS 7を対象としたので msodbcsql-13.0.0.0.tar.gz を入手

これを展開して、まずは既存OS環境が適しているか確認します

[root@c src]# gzip -cd msodbcsql-13.0.0.0.tar.gz | tar xf - && cd msodbcsql-13.0.0.0
[root@c msodbcsql-13.0.0.0]# ./install.sh verify
 
Microsoft ODBC Driver 13 for SQL Server Installation Script
Copyright Microsoft Corp.
 
Starting install for Microsoft ODBC Driver 13 for SQL Server
 
Checking for 64 bit Linux compatible OS ..................................... OK
Checking required libs are installed ........................................ OK
unixODBC utilities (odbc_config and odbcinst) installed ..................... OK
unixODBC Driver Manager version 2.3.1 installed ............................. OK
unixODBC Driver Manager configuration correct .............................. OK*
Microsoft ODBC Driver 13 for SQL Server already installed ............ NOT FOUND
 
Install log created at /tmp/msodbcsql.6886.320.9581/install.log.
 
One or more steps may have an *. See README for more information regarding
these steps.
[root@c msodbcsql-13.0.0.0]#

問題ないようなので、次に実際にMicrosoft ODBC Driverをインストールします。
既定のままだと /opt/microsoft/msodbcsql 以下にインストールされ、設定ファイル /etc/odbcinst.ini が置かれる。

[root@c msodbcsql-13.0.0.0]# ./install.sh install --accept-license
 
Microsoft ODBC Driver 13 for SQL Server Installation Script
Copyright Microsoft Corp.
 
Starting install for Microsoft ODBC Driver 13 for SQL Server
 
Checking for 64 bit Linux compatible OS ..................................... OK
Checking required libs are installed ........................................ OK
unixODBC utilities (odbc_config and odbcinst) installed ..................... OK
unixODBC Driver Manager version 2.3.1 installed ............................. OK
unixODBC Driver Manager configuration correct .............................. OK*
Microsoft ODBC Driver 13 for SQL Server already installed ............ NOT FOUND
Microsoft ODBC Driver 13 for SQL Server files copied ........................ OK
Symbolic links for bcp and sqlcmd created ................................... OK
Microsoft ODBC Driver 13 for SQL Server registered ................... INSTALLED
 
Install log created at /tmp/msodbcsql.2725.5527.1554/install.log.
 
One or more steps may have an *. See README for more information regarding
these steps.
[root@c msodbcsql-13.0.0.0]#

これでドライバのインストールは完了です。
/etc/odbcinst.iniには下記のように追記されます。

[root@c ~]# cat /etc/odbcinst.ini
(略)
 
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.0.so.0.0
Threading=1
UsageCount=1
 
[root@c ~]#

SQLServerとの接続

まずは sqlcmd を使って接続してみます。(odbcとは関係なく接続確認するために)
sqlcmdを実行すると、下記のようにどこかで見たような錯覚を覚えます。その錯覚を生かして接続を行います。

[root@c ~]# sqlcmd
Microsoft (R) SQL Server Command Line Tool
Version 13.0.0000.0 Linux
Copyright (c) 2012 Microsoft. All rights reserved.
 
usage: sqlcmd            [-U login id]          [-P password]
  [-S server or Dsn if -D is provided]
  [-H hostname]          [-E trusted connection]
  [-N Encrypt Connection][-C Trust Server Certificate]
  [-d use database name] [-l login timeout]     [-t query timeout]
  [-h headers]           [-s colseparator]      [-w screen width]
  [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
  [-c cmdend]
  [-q "cmdline query"]   [-Q "cmdline query" and exit]
  [-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
  [-u unicode output]    [-r[0|1] msgs to stderr]
  [-i inputfile]         [-o outputfile]
  [-k[1|2] remove[replace] control characters]
  [-y variable length type display width]
  [-Y fixed length type display width]
  [-p[1] print statistics[colon format]]
  [-R use client regional setting]
  [-K application intent]
  [-M multisubnet failover]
  [-b On error batch abort]
  [-D Dsn flag, indicate -S is Dsn]
  [-X[1] disable commands, startup script, environment variables [and exit]]
  [-x disable variable substitution]
  [-? show syntax summary]
[root@c ~]#

っで、SQLServerの構成とかによるが、

[illya@c ~]$ sqlcmd -S fm -Uillya
Password:
1> use sample
2> go
データベース コンテキストが 'sample' に変更されました。
1>
2> exit
[illya@c ~]$

で入れる。
っでsambaなActiveDomainなので、ドメイン認証でいけるかな?って思ったのだが、

[illya@c ~]$ sqlcmd -S fm -E
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : SSPI Provider: Server not found in Kerberos database.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Cannot generate SSPI context.
[illya@c ~]$

と言われた。設定不足かも。

unixODBC提供 isql で接続

DSNを用意します。定義する場所は /etc/odbc.ini です。

インストールしたMicrosoft ODBC Driverを使って、マシンfmのsampleデータベースにアクセスするDSNは、

[root@c ~]# cat /etc/odbc.ini
[mssql-sample]
Driver = ODBC Driver 13 for SQL Server
Description = fm sqlserver sample database
SERVER = fm.sybyl.local
DATABASE = sample
[root@c ~]#

となる。まぁ「ODBCデータソースアドミニストレータ」で言うところの「ユーザDSN」タブでしょうか
2016y06m26d_021701988.png

ここでunixODBCで提供されるodbc経由での接続プログラム「isql」でテストしてみます

[root@c ~]# isql mssql-sample illya illya
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> quit
[root@c ~]#

これでodbc経由で接続が確認できた。

php-odbcで接続

単に yum で php-odbcをインストールして

[root@c ~]# yum install php-odbc

phpスクリプトを用意します。pdoで作ると

[root@c ~]# cat /tmp/odbc.php
<?php
 
$dbh = new PDO("odbc:mssql-sample", "illya", "illya" );
$sql = "SELECT id FROM TEST_TABLE";
$sth = $dbh->prepare($sql);
$sth->execute();
$res = $sth->fetchAll();
print_r($res);
 
?>
[root@c ~]#

な感じでしょうか


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2016-06-26 (日) 15:01:28 (482d)