Perguntas Frequentes sobre ODBC no Linux e macOS

Baixar driver ODBC

Este artigo responde a perguntas comuns sobre instalar, conectar-se com e desenvolver aplicações para o Microsoft ODBC Driver for SQL Server no Linux e no macOS.

Sobre o driver

Qual versão do driver ODBC devo usar?

Use o Microsoft ODBC Driver 18 para SQL Server, a linha atual de drivers, para novos desenvolvimentos. O Driver ODBC 17 da Microsoft para SQL Server continua suportado para aplicações que já o implantam, conforme descrito no ciclo de vida de suporte.

A mudança de atualização que afeta a maioria dos aplicativos é que o Driver 18 criptografa as conexões por padrão. Para todas as diferenças, veja Diferenças entre versões principais.

Quais sistemas operacionais e arquiteturas de processador o driver suporta?

O Driver 18 suporta estes sistemas operacionais e arquiteturas de processadores:

Sistema operacional Suporte a x64 Suporte ao Arm64
Linux alpino Yes Começando pelo Driver 18.3
Azure Linux Yes Começando com o Driver 18.6.1
Debian Yes Começando com o Driver 18.1
Oracle Linux Yes No
Red Hat Enterprise Linux Yes Começando com o Driver 18.1
SUSE Linux Enterprise Server Yes No
Ubuntu Yes Começando com o Driver 18.1
macOS Yes Começando com o Driver 17.8

As versões do sistema operacional suportadas mudam a cada lançamento do driver. Para a tabela versão por versão, veja Requisitos do Sistema.

Quais recursos do SQL Server o driver Linux e macOS suporta?

O driver no Linux e macOS suporta a maioria dos recursos do SQL Server. Ele não suporta o alistamento distribuído de transações através do SQL_ATTR_ENLIST_IN_DTC atributo, espelhamento de banco de dados, FILESTREAM ou os atributos de perfil de desempenho do driver. O LocalDB não está disponível no Linux ou macOS. Transações XA através do Coordenador de Transações Distribuídas (DTC) são suportadas a partir do Driver 17.3. Para mais informações, veja Usar transações XA com DTC. Para a lista completa, veja Limitações.

O driver é código aberto?

No. O driver Microsoft ODBC para SQL Server não é código aberto.

Instalar e configurar

Qual gerenciador de drivers o driver usa?

O driver usa o gerenciador de drivers unixODBC. Quando você instala o Driver 17 ou 18 com o gerenciador de pacotes ou Homebrew da sua plataforma, o unixODBC é instalado como uma dependência. Siga os passos para Linux ou macOS.

No macOS, construa e execute sua aplicação com unixODBC em vez de iODBC. Iguale a arquitetura da plataforma da aplicação, do gerenciador de drivers e do driver. Um erro como incompatible architecture (have 'arm64', need 'x86_64') indica um descompasso de arquitetura, não necessariamente o gerenciador de drivers errado.

Como faço para verificar quais drivers estão instalados e quais arquivos de configuração estão em uso?

Execute odbcinst -q -d para listar os drivers registrados. A saída mostra cada nome de driver exatamente como uma cadeia de conexão deve soletrá-lo:

[ODBC Driver 18 for SQL Server]

Execute odbcinst -j para mostrar a versão do unixODBC e os caminhos de odbcinst.ini, que registra os drivers, e de odbc.ini, que contém os nomes das fontes de dados do sistema e do usuário (DSNs):

unixODBC 2.3.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/<user>/.odbc.ini

Para configurar uma DSN, veja Strings de conexão e DSNs.

Por que o gerenciador de drivers informa que não consegue abrir a biblioteca de drivers?

O erro é o seguinte:

[01000][unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server' : file not found

Verifique essas causas em ordem:

  1. O Driver valor na cadeia de conexão ou DSN não corresponde ao nome do driver registrado. Execute odbcinst -q -d e copie exatamente o nome.
  2. Seu aplicativo usa arquivos de configuração diferentes dos que você editou. Execute odbcinst -j a partir do mesmo ambiente que a aplicação e verifique qual gerenciador de drivers a aplicação carrega. No macOS, crie links simbólicos de configuração apenas se a aplicação precisar deles, conforme descrito em Solução de Problemas no macOS.
  3. Mais de uma cópia do gerenciador de drivers unixODBC está instalada, e seu aplicativo carrega o gerenciador errado. No Linux, execute find /usr -name 'libodbc*.so*'. No macOS, execute find /opt/homebrew /usr/local -name 'libodbc*.dylib'. Múltiplos caminhos sozinhos não provam que múltiplos gerenciadores de drivers estão instalados: links homebrew podem apontar para a mesma biblioteca no diretório Cellar. Verifique qual biblioteca o aplicativo realmente carrega. Para mais informações, veja Solucionar problemas de conexão.

Conectar e autenticar

Por que uma conexão que funciona com o Driver 17 falha com um erro de certificado no Driver 18?

O driver 18 usa Encrypt=yes por padrão. O driver 17 usa Encrypt=no por padrão apenas quando nenhuma configuração Authentication não vazia ou token de acesso é fornecido. Uma configuração não vazia Authentication , incluindo Authentication=SqlPassword, ou um token de acesso, altera o Driver 17 por padrão para Encrypt=yes. Configurações explícitas de criptografia sobrepõem esses padrões.

Verifique as configurações efetivas na sua cadeia de conexão, DSN e atributos de pré-conexão definidos por SQLSetConnectAttr. Por exemplo, Encrypt=yes em uma DSN ou SQL_COPT_SS_ENCRYPT=SQL_EN_ON solicita criptografia mesmo quando a cadeia de conexão omite Encrypt. Forneça tokens de acesso apenas através do atributo de conexão SQL_COPT_SS_ACCESS_TOKEN, não de uma palavra-chave de cadeia de conexão.

Com Encrypt=yes e TrustServerCertificate=no, ambos os drivers criptografam a conexão e validam o certificado do servidor. Com Encrypt=no, o Driver 17 não valida o certificado, enquanto o Driver 18 o valida se o servidor forçar a criptografia e TrustServerCertificate=no. Uma conexão que anteriormente usava o padrão do Driver 17 Encrypt=no pode, portanto, falhar com o Driver 18 contra um servidor com certificado autoassinado ou não confiável. Com um certificado autoassinado, o erro do Driver 18 é o seguinte:

[Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate]
[Microsoft][ODBC Driver 18 for SQL Server]Client unable to establish connection. For solutions related to encryption errors, see https://go.microsoft.com/fwlink/?linkid=2226722

Prefira um certificado confiável ou a fixação de certificado. Use estas opções:

  • Instale um certificado no servidor emitido por uma autoridade certificadora em quem o cliente confia. Se o certificado for confiável, mas seu nome não corresponder ao valor de Server, defina HostNameInCertificate para o nome no certificado. HostNameInCertificate muda apenas o nome esperado, então não corrige um certificado autoassinado.
  • Com o Driver 18.1 e versões posteriores e um servidor que suporta Tabular Data Stream (TDS) 8.0, defina Encrypt=strict e defina ServerCertificate como o caminho de uma cópia do certificado do servidor. O motorista então aceita apenas esse certificado exato. ServerCertificate funciona apenas no modo estrito.
  • Defina Encrypt=no somente se você aceitar tráfego de aplicação não criptografado quando o servidor não forçar criptografia. Isso corresponde ao padrão do Driver 17 apenas quando nenhuma configuração não vazia Authentication ou token de acesso é fornecido e nenhuma substituição de criptografia é definida. Se o servidor forçar a criptografia, o Driver 18 ainda valida o certificado, a menos que TrustServerCertificate=yes desative a validação.

Caution

TrustServerCertificate=yes não ativa a criptografia. Com Encrypt=yes, ele contorna a validação de certificados enquanto mantém o tráfego criptografado, deixando a conexão aberta a ataques man-in-the-middle. Com Encrypt=no, o tráfego de aplicação permanece sem criptografia, a menos que o servidor force a criptografia; se o servidor forçar a criptografia, a validação do certificado é contornada. Com Encrypt=strict, o driver ignora TrustServerCertificate e valida o certificado, ou o compara com ServerCertificate quando configurado. Prefira um certificado confiável ou um pin de certificado.

Para mais informações, veja Comportamento padrão de criptografia.

O driver suporta autenticação Kerberos?

Sim. Receba um ticket Kerberos com kinit, e depois conecte-se com Trusted_Connection=yes na cadeia de conexão ou DSN. A instância do SQL Server precisa de um nome principal de serviço (SPN) registrado. Para ver as etapas de configuração, veja Usar autenticação integrada.

O driver suporta autenticação Microsoft Entra ID?

Sim, para Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e SQL Server 2022 e versões posteriores. Para configurar o SQL Server, inclusive via Azure Arc, use a autenticação Microsoft Entra para o SQL Server. No Linux e macOS, o Driver 17 e versões posteriores suportam estes métodos:

  • Identidade gerenciada, com Authentication=ActiveDirectoryMsi, a partir do Driver 17.3.
  • Entidade de serviço, com Authentication=ActiveDirectoryServicePrincipal, começando com o Driver 17.7.
  • Autenticação integrada via Kerberos em um ambiente federado, com Authentication=ActiveDirectoryIntegrated, começando pelo Driver 17.6.
  • Um token de acesso que sua aplicação obtém, passado pelo atributo de conexão SQL_COPT_SS_ACCESS_TOKEN.

ActiveDirectoryInteractiveestá disponível apenas no driver do Windows. ActiveDirectoryPassword está obsoleto. A autenticação gerenciada por drivers no Linux e macOS não suporta cenários que exigem políticas de acesso condicional. Se sua aplicação adquirir um token de acesso separadamente, a biblioteca de autenticação e as políticas do Microsoft Entra ID regerão esse processo de aquisição do token. Passe o token através de SQL_COPT_SS_ACCESS_TOKEN.

No Alpine Linux, a autenticação integrada requer uma compilação libcurl com suporte ao Mecanismo de Negociação de Interface de Programa de Aplicação de Serviço Genérico de Segurança Simples e Protegida (SPNEGO). Verifique suas capacidades instaladas libcurl em vez de assumir que o pacote padrão suporta isso.

Para strings de conexão e exemplos de código, veja Usar o Microsoft Entra ID com o driver ODBC.

Desenvolver e solucionar problemas

Um aplicativo ODBC existente pode usar o driver no Linux ou macOS?

Sim. Uma aplicação escrita na interface de programação de aplicações ODBC (API) e compilada com unixODBC pode carregar esse driver. Para usar recursos específicos do SQL Server, inclua msodbcsql.h após os cabeçalhos unixODBC. Para comandos de compilador e nomes de bibliotecas, veja Desenvolver aplicações em C e C++ com o driver ODBC.

Existe algum aplicativo de exemplo?

Sim. Conecte-se e consulte com C++ e ODBC compila e executa um exemplo no Linux, macOS e Windows.

Como faço para rastrear chamadas ODBC?

Arquivos de rastreamento podem conter dados sensíveis. Como conta que roda sua aplicação, crie um diretório que somente essa conta possa acessar:

mkdir -m 700 "$HOME/odbc-trace"

Adicione essas configurações à seção [ODBC] de odbcinst.ini. Substitua /home/<user>/odbc-trace/odbctrace.log pelo caminho absoluto dentro do diretório que você criou. No macOS, os diretórios domésticos normalmente usam /Users/<user> em vez de /home/<user>.

Mantenha o caminho completo do arquivo de traço em 62 bytes ou menos para evitar truncamento pelo unixODBC.

[ODBC]
Trace = Yes
TraceFile = /home/<user>/odbc-trace/odbctrace.log

Essas configurações permitem o rastreamento para aplicações que usam essa configuração do gerenciador de drivers, e o rastreamento os atrasa. Use um diretório privado separado para cada conta de aplicação. Remova Trace = Yes quando terminar e apague os arquivos de rastreamento que não precisa mais. Para rastreamento por aplicação, veja rastreamento de acesso a dados no Linux e macOS.

Dados de caracteres

Qual codificação Unicode uma aplicação deve usar?

Use UTF-16LE (little endian) para dados SQLWCHAR. Use buffers UTF-16 SQLWCHAR com as APIs ODBC de caracteres largos em vez do tipo nativo wchar_t, que é de 32 bits no Linux e macOS.

Use UTF-8 para os dados SQLCHAR. A partir do Driver 17, o driver também aceita um conjunto de páginas de código de byte único e de byte duplo para dados SQLCHAR quando a localidade do processo seleciona uma. Os processos começam no C locale, então o driver usa UTF-8, a menos que o aplicativo chame setlocale. Para a lista de codificações, veja Processar dados de caracteres.