sql >> Base de Datos >  >> RDS >> Database

Configuración de atributos de conexión ODBC sin tener que escribir código

Recientemente, un cliente que estaba usando nuestro controlador ODBC de SQL Server para conectar Oracle® en Linux a SQL Server, preguntó si era posible habilitar el nivel de aislamiento de instantáneas desde una fuente de datos ODBC.

Puede habilitar este nivel de aislamiento configurando un atributo de conexión en una llamada SQLSetConnectAttr. Sin embargo, este método no es aplicable si no tiene acceso al código fuente de la aplicación, como fue el caso de nuestro cliente de Oracle®.

Como alternativa, puede utilizar un mecanismo proporcionado por unixODBC Driver Manager para configurar los atributos de conexión:

DMConnAttr=[attribute]=value

Nota Necesita 1.9.10+ del controlador ODBC de SQL Server para establecer atributos de conexión a través de DMConnAttr .

El atributo y el valor relevantes para el nivel de aislamiento de la instantánea se encuentran en el archivo de encabezado de SQL Server sqlncli.h, que se encuentra en la distribución del controlador ODBC de 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)

lo que nos da la siguiente línea para agregar a nuestra fuente de datos ODBC:

DMConnAttr=[1227]=\32

1227 es el atributo (1200+27) y 32 es el valor (el valor decimal de 0x00000020L es 32).

Para probar que nuestra configuración era correcta, nosotros:

$ 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