Este artigo responde a perguntas comuns sobre a instalação, ligação ao e desenvolvimento de aplicações para o Microsoft ODBC Driver for SQL Server no Linux e no macOS.
Sobre o motorista
Que versão do driver ODBC devo usar?
Use o Microsoft ODBC Driver 18 para SQL Server, a linha de drivers atual, para novos desenvolvimentos. O Microsoft ODBC Driver 17 para SQL Server continua suportado para aplicações que já o implementam, conforme descrito no ciclo de vida do suporte.
A alteração de atualização que afeta a maioria das aplicações é que o Driver 18 encripta as ligações por defeito. Para ver todas as diferenças, veja Diferenças entre versões principais.
Que sistemas operativos e arquiteturas de processadores suporta o driver?
O Driver 18 suporta estes sistemas operativos e arquiteturas de processadores:
| Sistema Operativo | Suporte x64 | Suporte Arm64 |
|---|---|---|
| Linux alpino | Yes | A partir do Driver 18.3 |
| Azure Linux | Yes | A partir do Driver 18.6.1 |
| Debian | Yes | A partir do Driver 18.1 |
| Oracle Linux | Yes | No |
| Red Hat Enterprise Linux | Yes | A partir do Driver 18.1 |
| SUSE Linux Enterprise Server | Yes | No |
| Ubuntu | Yes | A partir do Driver 18.1 |
| macOS | Yes | A partir do Driver 17.8 |
As versões suportadas do sistema operativo mudam a cada lançamento do driver. Para a tabela por versão, consulte Requisitos do sistema.
Que funcionalidades do SQL Server são suportadas pelo controlador para Linux e macOS?
O driver no Linux e macOS suporta a maioria das funcionalidades do SQL Server. Não suporta o registo distribuído de transações através do SQL_ATTR_ENLIST_IN_DTC atributo, espelhamento de base de dados, FILESTREAM ou os atributos de perfil de desempenho do driver. O LocalDB não está disponível no Linux ou macOS. As transações XA através do Distributed Transaction Coordinator (DTC) são suportadas a partir do Driver 17.3. Para mais informações, consulte Usar transações XA com DTC. Para a lista completa, veja Limitações.
O driver é open source?
No. O driver Microsoft ODBC para SQL Server não é open source.
Instalar e configurar
Que gestor de controladores é que o controlador utiliza?
O driver utiliza o gestor de drivers unixODBC. Quando instalas o Driver 17 ou 18 com o gestor de pacotes ou o Homebrew da tua plataforma, o unixODBC é instalado como uma dependência. Segue os passos para Linux ou macOS.
No macOS, constrói e executa a tua aplicação com unixODBC em vez de iODBC. Faça corresponder a arquitetura do processador da aplicação, gestor de drivers e driver. Um erro como incompatible architecture (have 'arm64', need 'x86_64') indica uma incompatibilidade de arquitetura, não necessariamente o gestor de drivers errado.
Como posso verificar quais os drivers instalados e quais os ficheiros de configuração em uso?
Corre odbcinst -q -d para listar os controladores registados. A saída mostra o nome de cada driver exatamente como uma cadeia de ligação deve escrever:
[ODBC Driver 18 for SQL Server]
Execute odbcinst -j para mostrar a versão unixODBC e os caminhos de odbcinst.ini, que regista os drivers, e odbc.ini, que contém os nomes das fontes de dados do sistema e do utilizador (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 ligação e DSNs.
Porque é que o gestor de drivers reporta 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 estas causas por ordem:
- O
Drivervalor na cadeia de ligação ou DSN não corresponde a um nome de driver registado. Executaodbcinst -q -de copia o nome exatamente. - A tua aplicação usa ficheiros de configuração diferentes dos que editaste. Executa
odbcinst -ja partir do mesmo ambiente que a aplicação e verifica qual o gestor de drivers que a aplicação carrega. No macOS, crie ligações simbólicas de configuração apenas se a aplicação precisar delas, conforme descrito em Resolução de Problemas no macOS. - Mais do que uma cópia do gestor de drivers unixODBC está instalada, e a sua aplicação carrega o gestor errado. Em Linux, execute
find /usr -name 'libodbc*.so*'. No macOS, executefind /opt/homebrew /usr/local -name 'libodbc*.dylib'. Vários caminhos, por si só, não provam que vários gestores de controladores estão instalados: as ligações do Homebrew podem apontar para a mesma biblioteca no seu diretório Cellar. Verifica qual a biblioteca que a aplicação carrega realmente. Para mais informações, consulte Resolver problemas de ligação.
Ligue e autentique
Porque é que uma ligação que funciona com o Driver 17 falha devido a um erro de certificado no Driver 18?
O Driver 18 é a predefinição para Encrypt=yes. O driver 17 usa Encrypt=no por predefinição apenas quando não há nenhuma configuração não vazia Authentication ou token de acesso fornecido. Uma definição não vazia Authentication , incluindo Authentication=SqlPassword, ou um token de acesso, altera o Driver 17 por defeito para Encrypt=yes. Definições explícitas de encriptação sobrepõem-se a estas predefinições.
Verifique as definições efetivas na sua cadeia de ligação, DSN e atributos de pré-conexão definidos através de SQLSetConnectAttr. Por exemplo, Encrypt=yes num DSN ou SQL_COPT_SS_ENCRYPT=SQL_EN_ON solicita encriptação mesmo quando a cadeia de ligação omite Encrypt. Forneça tokens de acesso apenas através do SQL_COPT_SS_ACCESS_TOKEN atributo de conexão, não de uma palavra-chave de cadeia de conexão.
Com Encrypt=yes e TrustServerCertificate=no, ambos os drivers encriptam a ligação e validam o certificado do servidor. Com Encrypt=no, o Driver 17 não valida o certificado, enquanto o Driver 18 valida-o se o servidor forçar a encriptação e TrustServerCertificate=no. Uma ligação que anteriormente usava o padrão do Driver 17 Encrypt=no pode, portanto, falhar com o Driver 18 contra um servidor com um certificado auto-assinado ou de outra forma não confiável. Com um certificado auto-assinado, 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 de confiança ou certificate pinning. Utilize estas opções:
- Instala um certificado no servidor emitido por uma autoridade certificadora em que o cliente confia. Se o certificado for confiável mas o seu nome não corresponder ao valor de
Server, definaHostNameInCertificatepara o nome no certificado.HostNameInCertificateMuda apenas o nome esperado, por isso não corrige um certificado auto-assinado. - Com o Driver 18.1 e versões posteriores e um servidor que suporta o Tabular Data Stream (TDS) 8.0, defina
Encrypt=stricte definaServerCertificatepara o caminho de uma cópia do certificado do servidor. O condutor aceita então apenas esse certificado exato.ServerCertificatefunciona apenas em modo estrito. - Define
Encrypt=noapenas se aceitares tráfego de aplicações não encriptado quando o servidor não forçar a encriptação. Isto corresponde ao padrão do Driver 17 apenas quando não é fornecida nenhuma configuração não vaziaAuthenticationnem token de acesso e não há substituição de encriptação definida. Se o servidor forçar a encriptação, o Driver 18 continua a validar o certificado, a menos queTrustServerCertificate=yesdesative a validação.
Caution
TrustServerCertificate=yes não permite a encriptação. Com Encrypt=yes, contorna a validação de certificados mantendo o tráfego encriptado, deixando a ligação aberta a ataques de adversário-no-meio. Com Encrypt=no, o tráfego da aplicação permanece sem encriptação, a menos que o servidor force a encriptação; se o servidor forçar a encriptação, a validação do certificado é contornada. Com Encrypt=strict, o driver ignora TrustServerCertificate e valida o certificado, ou compara-o com ServerCertificate quando configurado. Prefira um certificado de confiança ou certificate pinning.
Para mais informações, veja Comportamento de encriptação por defeito.
O driver suporta autenticação Kerberos?
Sim. Obtém um ticket Kerberos com kinit, e depois liga-te a Trusted_Connection=yes na cadeia de ligação ou DSN. A instância do SQL Server necessita de um nome principal de serviço (SPN) registado. Para os passos de configuração, veja Usar autenticação integrada.
O driver suporta autenticação Microsoft Entra ID?
Sim, para Base de Dados SQL do Azure, Azure SQL Managed Instance e SQL Server 2022 e versões posteriores. Para configurar o SQL Server, incluindo através do Azure Arc, utilize 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 gerida, com
Authentication=ActiveDirectoryMsi, começando pelo Driver 17.3. - service principal, com
Authentication=ActiveDirectoryServicePrincipal, a partir do Driver 17.7. - Autenticação integrada através do Kerberos num ambiente federado, com
Authentication=ActiveDirectoryIntegrated, a partir do Driver 17.6. - Um token de acesso que a sua aplicação obtém, passado através do
SQL_COPT_SS_ACCESS_TOKENatributo de conexão.
ActiveDirectoryInteractiveestá disponível apenas no driver do Windows.
ActiveDirectoryPassword está obsoleto. A autenticação gerida por drivers no Linux e macOS não suporta cenários que exijam políticas de acesso condicional. Se a sua aplicação adquirir um token de acesso separadamente, a biblioteca de autenticação e as políticas do Microsoft Entra ID regem essa aquisição do token. Passe o token através de SQL_COPT_SS_ACCESS_TOKEN.
No Alpine Linux, a autenticação integrada requer uma libcurl compilação com suporte para o Mecanismo de Negociação de Interface de Aplicação para Serviços Genéricos de Segurança Simples e Protegidos (SPNEGO). Verifique as suas capacidades instaladas libcurl em vez de assumir que o pacote padrão as suporta.
Para strings de ligação e exemplos de código, veja Usar o Microsoft Entra ID com o driver ODBC.
Desenvolver e diagnosticar e resolver problemas
Uma aplicação ODBC existente pode usar o driver no Linux ou macOS?
Sim. Uma aplicação escrita na interface de programação de aplicações (API) ODBC e compilada com base em unixODBC pode carregar este controlador. Para utilizar funcionalidades específicas do SQL Server, inclua msodbcsql.h depois dos cabeçalhos unixODBC. Para comandos de compilador e nomes de bibliotecas, veja Desenvolver aplicações em C e C++ com o driver ODBC.
Existe alguma aplicação de exemplo?
Sim. Ligue-se e consulte com C++ e ODBC compila e executa um exemplo no Linux, macOS e Windows.
Como posso rastrear chamadas ODBC?
Os ficheiros de rastreio podem conter dados sensíveis. Na conta que executa a sua aplicação, crie um diretório ao qual só essa conta possa aceder:
mkdir -m 700 "$HOME/odbc-trace"
Adicione estas definições à [ODBC] secção de odbcinst.ini. Substitui /home/<user>/odbc-trace/odbctrace.log pelo caminho absoluto dentro do diretório que criaste. No macOS, os diretórios domésticos normalmente usam /Users/<user> em vez de /home/<user>.
Mantenha o caminho completo do ficheiro de rastreamento com 62 bytes ou menos para evitar truncamento pelo unixODBC.
[ODBC]
Trace = Yes
TraceFile = /home/<user>/odbc-trace/odbctrace.log
Estas definições permitem o rastreamento para aplicações que utilizam esta configuração de gestor de drivers, e o rastreio atrasa-as. Utilize um diretório privado separado para cada conta de aplicação. Remove Trace = Yes quando terminares e apaga os ficheiros de rastreamento que já não precisas. Para rastreamento por aplicação, veja Rastreio de acesso a dados no Linux e macOS.
Dados de carateres
Que codificação Unicode deve uma aplicação usar?
Use UTF-16LE (little endian) para dados SQLWCHAR. Utilize buffers UTF-16 SQLWCHAR com as APIs ODBC de caráteres largos em vez do tipo nativo wchar_t, que é de 32 bits no Linux e macOS.
Utilize UTF-8 para SQLCHAR dados. A partir do Driver 17, o driver também aceita um conjunto de páginas de código de um ou dois bytes para dados SQLCHAR quando a configuração regional do processo seleciona uma. Os processos começam no C locale, por isso o driver usa UTF-8, a menos que a aplicação chame setlocale. Para a lista de codificações, veja Processar dados de caráter.