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

Impostazione degli attributi di connessione ODBC senza dover scrivere codice

Di recente, un cliente che utilizzava il nostro driver ODBC di SQL Server per connettere Oracle® su Linux a SQL Server, ha chiesto se fosse possibile abilitare il livello di isolamento degli snapshot da un'origine dati ODBC.

È possibile abilitare questo livello di isolamento impostando un attributo di connessione in una chiamata SQLSetConnectAttr. Tuttavia, questo metodo non è applicabile se non hai accesso al codice sorgente dell'applicazione, come nel caso del nostro cliente Oracle®.

In alternativa, puoi utilizzare un meccanismo fornito da unixODBC Driver Manager per impostare gli attributi di connessione:

DMConnAttr=[attribute]=value

Nota È necessaria la versione 1.9.10+ del driver ODBC di SQL Server per impostare gli attributi di connessione tramite DMConnAttr .

L'attributo e il valore pertinenti per il livello di isolamento dello snapshot sono contenuti nel file di intestazione di SQL Server sqlncli.h, contenuto nella distribuzione del driver ODBC di SQL Server:

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

che ci fornisce la seguente riga da aggiungere alla nostra origine dati ODBC:

DMConnAttr=[1227]=\32

1227 è l'attributo (1200+27) e 32 è il valore (il valore decimale di 0x00000020L è 32).

Per verificare che le nostre impostazioni fossero corrette, noi:

$ 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