Database
 sql >> Datenbank >  >> RDS >> Database

Festlegen von ODBC-Verbindungsattributen, ohne Code schreiben zu müssen

Kürzlich fragte ein Kunde, der unseren SQL Server ODBC-Treiber verwendete, um Oracle® unter Linux mit SQL Server zu verbinden, ob es möglich sei, die Snapshot-Isolationsstufe von einer ODBC-Datenquelle aus zu aktivieren.

Sie können diese Isolationsstufe aktivieren, indem Sie ein Verbindungsattribut in einem SQLSetConnectAttr-Aufruf festlegen. Diese Methode ist jedoch nicht anwendbar, wenn Sie keinen Zugriff auf den Quellcode der Anwendung haben, wie es bei unserem Oracle®-Kunden der Fall war.

Alternativ können Sie einen vom unixODBC-Treiber-Manager bereitgestellten Mechanismus verwenden, um Verbindungsattribute festzulegen:

DMConnAttr=[attribute]=value

Hinweis Sie benötigen 1.9.10+ des SQL Server ODBC-Treibers, um Verbindungsattribute über DMConnAttr festzulegen .

Das relevante Attribut und der Wert für die Snapshot-Isolationsstufe sind in der SQL Server-Headerdatei sqlncli.h enthalten, die in der SQL Server-ODBC-Treiberverteilung enthalten ist:

#define SQL_COPT_SS_BASE            1200
#define SQL_TXN_SS_SNAPSHOT              0x00000020L
#define SQL_COPT_SS_TXN_ISOLATION        (SQL_COPT_SS_BASE+27)

was uns die folgende Zeile zum Hinzufügen zu unserer ODBC-Datenquelle gibt:

DMConnAttr=[1227]=\32

1227 ist das Attribut (1200+27) und 32 ist der Wert (der Dezimalwert von 0x00000020L ist 32).

Um zu testen, ob unsere Einstellungen korrekt waren, haben wir:

$ 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