sql >> Databasteknik >  >> RDS >> Database

Ställa in ODBC-anslutningsattribut utan att behöva skriva kod

Nyligen frågade en kund som använde vår SQL Server ODBC-drivrutin för att ansluta Oracle® på Linux till SQL Server om det var möjligt att aktivera isoleringsnivån för ögonblicksbild från en ODBC-datakälla.

Du kan aktivera denna isoleringsnivå genom att ställa in ett anslutningsattribut i ett SQLSetConnectAttr-anrop. Den här metoden är dock inte tillämplig om du inte har tillgång till programmets källkod, vilket var fallet med vår Oracle®-kund.

Som ett alternativ kan du använda en mekanism som tillhandahålls av unixODBC Driver Manager för att ställa in anslutningsattribut:

DMConnAttr=[attribute]=value

Obs Du behöver 1.9.10+ av SQL Server ODBC-drivrutinen för att ställa in anslutningsattribut via DMConnAttr .

Det relevanta attributet och värdet för ögonblicksbildsisoleringsnivån finns i SQL Server-huvudfilen sqlncli.h, som finns i SQL Server ODBC-drivrutinsdistributionen:

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

vilket ger oss följande rad att lägga till i vår ODBC-datakälla:

DMConnAttr=[1227]=\32

1227 är attributet (1200+27) och 32 är värdet (decimalvärdet på 0x00000020L är 32).

För att testa att våra inställningar var korrekta:

$ 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

  1. 4 sätt att få en vys definition med Transact-SQL

  2. Spåra PostgreSQL med perf

  3. Val av lagringsmotor:Aria

  4. PostgreSQL 9.1:Hur man sammanfogar rader i array utan dubbletter, GÅ MED i en annan tabell