最近、SQL ServerODBCドライバーを使用してLinux上のOracle®をSQLServerに接続していた顧客から、ODBCデータソースからスナップショットアイソレーションレベルを有効にできるかどうか尋ねられました。
SQLSetConnectAttr呼び出しで接続属性を設定することにより、この分離レベルを有効にできます。ただし、Oracle®のお客様の場合のように、アプリケーションのソースコードにアクセスできない場合、この方法は適用できません。
別の方法として、unixODBCドライバーマネージャーが提供するメカニズムを使用して、接続属性を設定できます。
DMConnAttr=[attribute]=value
注 DMConnAttr
を介して接続属性を設定するには、1.9.10以上のSQLServerODBCドライバーが必要です。 。
スナップショットアイソレーションレベルに関連する属性と値は、SQLServerヘッダーファイルsqlncli.hに含まれています。このファイルはSQLServerODBCドライバーディストリビューションに含まれています。
#define SQL_COPT_SS_BASE 1200 #define SQL_TXN_SS_SNAPSHOT 0x00000020L #define SQL_COPT_SS_TXN_ISOLATION (SQL_COPT_SS_BASE+27)
これにより、ODBCデータソースに追加する次の行が得られます。
DMConnAttr=[1227]=\32
1227は属性(1200 + 27)で、32は値です(0x00000020Lの10進値は32です)。
設定が正しいことをテストするために、次のことを行います。
$ more /etc/odbc.ini [SQLSERVER_SAMPLE] Driver=Easysoft ODBC-SQL Server Server=myserver Port=50217 Database=adventureworks User=sa Password=p455w0rd $ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE SQL> SELECT CASE transaction_isolation_level WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END FROM sys.dm_exec_sessions where session_id = @@SPID ReadCommitted more /etc/odbc.ini [SQLSERVER_SAMPLE] Driver=Easysoft ODBC-SQL Server Server=myserver Port=50217 Database=adventureworks User=sa Password=p455w0rd DMConnAttr=[1227]=\32 $ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_SAMPLE SQL> SELECT CASE transaction_isolation_level WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END FROM sys.dm_exec_sessions where session_id = @@SPID Snapshot