Database
 sql >> Base de données >  >> RDS >> Database

Définition des attributs de connexion ODBC sans avoir à écrire de code

Récemment, un client qui utilisait notre pilote ODBC SQL Server pour connecter Oracle® sur Linux à SQL Server, a demandé s'il était possible d'activer le niveau d'isolement d'instantané à partir d'une source de données ODBC.

Vous pouvez activer ce niveau d'isolement en définissant un attribut de connexion dans un appel SQLSetConnectAttr. Cependant, cette méthode n'est pas applicable si vous n'avez pas accès au code source de l'application, comme c'était le cas avec notre client Oracle®.

Comme alternative, vous pouvez utiliser un mécanisme fourni par le gestionnaire de pilotes unixODBC pour définir les attributs de connexion :

DMConnAttr=[attribute]=value

Remarque Vous avez besoin de 1.9.10+ du pilote ODBC SQL Server pour définir les attributs de connexion via DMConnAttr .

L'attribut et la valeur pertinents pour le niveau d'isolement de l'instantané sont contenus dans le fichier d'en-tête SQL Server sqlncli.h, qui est contenu dans la distribution du pilote ODBC 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)

ce qui nous donne la ligne suivante à ajouter à notre source de données ODBC :

DMConnAttr=[1227]=\32

1227 est l'attribut (1200+27) et 32 ​​est la valeur (la valeur décimale de 0x00000020L est 32).

Pour vérifier que nos paramètres étaient corrects, nous :

$ 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