Database
 sql >> Base de Dados >  >> RDS >> Database

Configurando atributos de conexão ODBC sem ter que escrever código


Recentemente, um cliente que estava usando nosso driver ODBC do SQL Server para conectar o Oracle® no Linux ao SQL Server perguntou se era possível habilitar o nível de isolamento de instantâneo de uma fonte de dados ODBC.

Você pode habilitar esse nível de isolamento definindo um atributo de conexão em uma chamada SQLSetConnectAttr. No entanto, esse método não é aplicável se você não tiver acesso ao código-fonte do aplicativo, como ocorreu com nosso cliente Oracle®.

Como alternativa, você pode usar um mecanismo fornecido pelo Gerenciador de Driver unixODBC para definir os atributos de conexão:
DMConnAttr=[attribute]=value

Observação Você precisa da versão 1.9.10+ do driver ODBC do SQL Server para definir atributos de conexão por meio de DMConnAttr .

O atributo e o valor relevantes para o nível de isolamento do instantâneo estão contidos no arquivo de cabeçalho do SQL Server sqlncli.h, que está contido na distribuição do driver ODBC do 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)

que nos dá a seguinte linha para adicionar à nossa fonte de dados ODBC:
DMConnAttr=[1227]=\32

1227 é o atributo (1200+27) e 32 é o valor (o valor decimal de 0x00000020L é 32).

Para testar se nossas configurações estavam corretas, nós:
$ 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