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