Principais diferenças de versão no Microsoft ODBC Driver for SQL Server

Este artigo descreve alterações marcantes entre o Microsoft ODBC Driver 18 para SQL Server e a versão 17. Use-o quando escolher uma versão do driver, atualizar uma aplicação da versão 17 para a versão 18, ou precisar de fazer uma cadeia de ligação comportar-se de forma consistente em ambas as versões.

A maioria das aplicações que atualizam da versão 17 para a versão 18 é afetada por uma única alteração: as ligações são encriptadas por defeito. Se a sua aplicação deixar de se ligar após atualizar, leia primeiro o comportamento de encriptação padrão .

Escolha a versão 17 ou a versão 18

O Driver 18 é a versão principal atual. O Driver 17 continua suportado, mas as aplicações que o utilizam ainda precisam da versão menor mais recente da linha Driver 17 para receber correções. Para datas de suporte e regras de manutenção, consulte ciclo de vida do Suporte.

Scenario Caminho recomendado
Nova aplicação Começa pelo Driver 18. Configure a encriptação e a validação de certificados antes da produção.
Aplicação existente do Driver 17 Instale o Driver 18 juntamente com o Driver 17, altere o nome do driver na cadeia de ligação ou DSN, e defina Encrypt explicitamente. Se a validação do certificado falhar, corrige o certificado do servidor ou o armazenamento de confiança do cliente.
Aplicação que precisa Encrypt=Strictde , HostnameInCertificate, RetryExec, ou outra palavra-chave Driver 18 Use uma versão do Driver 18 que suporte essa configuração. O Driver 17 não aceita o Strict valor de Encrypt nem reconhece as novas palavras-chave.
Aplicação que necessita de fixação de ficheiro certificado com ServerCertificate Use o Driver 18.1 ou uma versão posterior com Encrypt=Strict. O driver 17 não suporta esta configuração.

Mudar de versão principal normalmente significa alterar o nome do driver ou o pacote que escolhes:

Platform Piloto 17 Piloto 18
Nome do driver da cadeia de ligação ODBC Driver 17 for SQL Server ODBC Driver 18 for SQL Server
Nome do pacote Linux msodbcsql17 msodbcsql18

Resumo das alterações

As linhas padrão e de validação descrevem ligações remotas normais sem uma definição DSNEncrypt, o SQL_COPT_SS_ENCRYPT atributo ou o sobreposição do Windows Force Protocol Encryption. O LocalDB não é um alvo remoto TLS.

Area Versão 17 Versão 18 e versões posteriores
Configuração padrão Encrypt no, a menos que Authentication seja definido para um valor diferente de none ou a aplicação define SQL_COPT_SS_ACCESS_TOKEN; então yes yes (18.0.1 e posteriores)
Encrypt Valores aceites yes, no yes, no, Mandatory, Optional, Strict
Modos de encriptação De vez em quando Desligada, ligada ou rígida
Validação de certificado do servidor Com Encrypt=yes;TrustServerCertificate=no, valida o certificado. Só a encriptação exigida pelo servidor não seleciona validação. Valida por defeito. Em modos não-Strict, TrustServerCertificate=yes ignora a validação normal, incluindo quando o servidor requer encriptação.
Palavras-chave de cadeia de ligação Conjunto base Conjunto base mais novas palavras-chave

Alterações de criptografia

Comportamento padrão de encriptação

O Driver 17 tem Encrypt=no por defeito a menos que a Authentication palavra-chave seja definida para um valor diferente de none ou a aplicação defina o SQL_COPT_SS_ACCESS_TOKEN atributo. Qualquer um altera o padrão para yes. Um still explícito Encrypt=no desliga a encriptação. O driver 18.0.1 e posteriores passam por defeito a Encrypt=yes. Define Encrypt explicitamente quando comparas versões.

A encriptação de ligação total protege o texto e os resultados da consulta, bem como o login. Com Encrypt=no, o servidor pode ainda exigir encriptação de ligação total. Quando tanto o cliente como o servidor desligam a encriptação, a negociação não-Strict utiliza encriptação apenas por login; isto não protege os dados da aplicação subsequentes.

Com Encrypt=yes;TrustServerCertificate=no, ambos os drivers selecionam a validação normal do certificado do servidor. Se apenas o servidor exigir encriptação de ligação total e TrustServerCertificate=no (o predefinido), o Driver 18 valida o certificado. Com TrustServerCertificate=yes o modo Strict fora de casa, o Driver 18 ignora essa validação. O Driver 17 não valida apenas por causa desse requisito do servidor. A encriptação do Windows Force Protocol e os caminhos internos de validação de certificados não são cobertos por esta comparação.

Com as definições de encriptação padrão, atualizar da versão 17 para a versão 18 pode expor um certificado de servidor não confiável. Se a versão 18 rejeitar o certificado, diagnostique a cadeia de certificados e o nome antes de alterar as definições de autenticação.

Mantenha a encriptação e validação da identidade do servidor ativadas:

  • Configure um certificado válido do servidor e o armazenamento de confiança do cliente para que o cliente confie na sua autoridade certificadora emissora. Liga-te usando um nome no certificado.
  • Se ligares por um alias, define HostnameInCertificate um nome válido no certificado do servidor. Esta definição não repara uma cadeia de certificados não confiável.
  • Para Encrypt=Strict, o Driver 18.1 e versões posteriores também suportam ServerCertificate a comparação do certificado do servidor com um ficheiro de certificado. Esta definição fixa um certificado; não especifica um nome de host. Revise as suas restrições no ODBC DSN e nas palavras-chave de cadeia de ligação antes de o usar.

Atenção

Para um ambiente de teste isolado, Encrypt=yes;TrustServerCertificate=yes pede encriptação mas ignora a validação da identidade do servidor, deixando a ligação aberta a ataques adversários no meio. Não o uses como reparação de confiança de produção. Em modo Rigoroso, TrustServerCertificate é ignorado.

Se uma aplicação existente exigir o padrão da versão 17 durante um teste de compatibilidade controlado, consulte Restaurar comportamento de encriptação da versão 17. Encrypt=no E Encrypt=optional não repare a confiança do certificado e pode deixar os dados da aplicação sem encriptação.

Encriptar valores

A versão 17 aceita apenas yes e no. A versão 18 e versões posteriores aceitam esses valores e acrescentam mais três:

Value Equivalente a Comportamento
Mandatory yes A ligação está encriptada.
Optional no Não pede encriptação de ligação total. O servidor ainda pode exigir isso; a encriptação apenas por login não é proteção para sessão completa.
Strict None A ligação utiliza encriptação TDS 8.0. O servidor deve suportar TDS 8.0, como o SQL Server 2022 e versões posteriores.

Strict não tem equivalente à versão 17. É o único valor que seleciona o TDS 8.0, onde a encriptação é negociada antes da troca de login em vez de durante ela.

Restaurar comportamento de encriptação da versão 17

Após rever as correções de confiança, use a seguinte configuração apenas para um teste de compatibilidade controlado que permita dados de aplicação não encriptados:

Encrypt=no

O Driver 18 também aceita Encrypt=optional esta configuração. Nenhum dos valores impede que o servidor precise de encriptação. Restaurar a configuração encriptada pretendida após o teste; não usar encriptação desativada como remédio de confiança de certificados.

Lista de verificação de upgrades

  1. Strings de ligação de inventário, DSNs, referências de pacotes e scripts de implementação que selecionam o Driver 17.
  2. Instala o Driver 18 num ambiente de teste que corresponda à produção.
  3. Mude a Driver palavra-chave em cada cadeia de ligação para ODBC Driver 18 for SQL Server, e atualize ou recrie cada DSN para usar o Driver 18. Instalar o Driver 18 não altera as ligações existentes, porque as ligações que nomeiam o Driver 17 continuam a usar o Driver 17.
  4. Defina Encrypt explicitamente. Use Encrypt=Mandatory com validação normal de certificados. Use Encrypt=Strict apenas quando o servidor suporta TDS 8.0, como o SQL Server 2022 e versões posteriores. Para servidores que não suportam TDS 8.0, use Encrypt=Mandatory.
  5. Para validação normal, ligue-se e TrustServerCertificate=no verifique a cadeia confiável e o nome do servidor aceite. Para o Driver 18.1 e versões posteriores com fixação de ficheiros Strict, verifique a correspondência exata dos certificados e as datas de validade; TrustServerCertificate é ignorado no modo Strict.
  6. Execute os caminhos de autenticação, consulta, transação, cópia em massa, failover e tentativa novamente da aplicação.
  7. Revise os diagnósticos para erros de validação de certificados antes de tratar falhas como autenticação ou erros de rede.
  8. Mantém o Driver 17 instalado e guarda o inventário desde o passo 1 até a validação estar concluída, para poderes voltar à versão 17.

Voltar para a versão 17

O Driver 17 e o Driver 18 instalam-se lado a lado, por isso podes voltar atrás sem desinstalar o Driver 18. Para detalhes de download e instalação, consulte Download ODBC Driver for SQL Server.

  1. Confirma se o Driver 17 ainda está instalado em cada cliente.
  2. Usando o inventário da checklist de atualização, altere a Driver palavra-chave em cada cadeia de ligação de volta para ODBC Driver 17 for SQL Server.
  3. Atualize ou recrie cada DSN para usar o Driver 17.
  4. Reverter referências de pacotes e scripts de implementação para o pacote Driver 17, como msodbcsql17 no Linux.
  5. Restaure os Encrypt valores e TrustServerCertificate que a aplicação usou com o Driver 17. O Driver 17 aceita apenas yes e no para Encrypt e não reconhece palavras-chave do Driver 18 como HostnameInCertificate ou ServerCertificate, por isso remova valores e palavras-chave adicionados para o Driver 18. Mudar as palavras-chave dos alias de volta para os nomes do Driver 17 e substituir ConnectTimeout por uma SQLSetConnectAttr chamada que defina SQL_ATTR_LOGIN_TIMEOUT. Para o mapeamento, veja Novas palavras-chave de cadeia de ligação.

Valide o rollback antes de o considerar completo:

  • Cada ligação reporta o Driver 17. Chame SQLGetInfo com SQL_DRIVER_VER; a versão principal é 17.
  • Os caminhos de autenticação, consulta, transação, cópia em massa, failover e retentativa da aplicação têm sucesso.
  • As cadeias de ligação e DSNs não contêm valores Encrypt ou palavras-chave que foram adicionados para o Driver 18.

Novas palavras-chave para cadeia de ligação

A versão 18 adiciona as seguintes palavras-chave de cadeia de ligação, que a versão 17 não reconhece. Alguns deles são novos nomes para definições que a versão 17 suporta sob uma palavra-chave ou atributo diferente, listados na coluna equivalente da Versão 17 .

Keyword Versão mínima Purpose Equivalente à versão 17
ConcatNullYieldsNull 18.6 Controla se a concatenação de um valor nulo resulta em valor nulo. None
ConnectTimeout 18.7 Define o tempo limite de login em segundos. Se a aplicação também definir SQL_ATTR_LOGIN_TIMEOUT, o atributo tem precedência. SQL_ATTR_LOGIN_TIMEOUT atributo, definido com SQLSetConnectAttr
FailoverPartner 18.7 Especifica o parceiro de failover para espelhamento de base de dados. Apenas Windows. Failover_Partner palavra-chave
GetDataExtensions 18,0 Controla quais SQLGetData extensões o driver ativa. None
HostnameInCertificate 18,0 Especifica o nome do host a validar no certificado TLS do servidor. None
IpAddressPreference 18.1 Especifica a família de endereços IP que o driver tenta primeiro. None
LongAsMax 18,0 Mapeia tipos de dados longos para os seus max equivalentes. None
MultipleActiveResultSets 18.7 Permite múltiplos conjuntos de resultados ativos (MARS). Aceita Yes ou No. MARS_Connection palavra-chave
RetryExec 18.1 Configura regras de retentativa para consultas falhadas. None
ServerCertificate 18.1 Especifica o ficheiro do certificado para corresponder ao certificado do servidor ao usar Encrypt=Strict. None
WorkstationID 18.7 Especifica o nome da estação de trabalho enviado ao servidor. WSID palavra-chave

MultipleActiveResultSets, WorkstationID, e FailoverPartner são pseudónimos que alinham nomes-chave ODBC com Microsoft.Data.SqlClient nomes de propriedades. A versão 18 também aceita os nomes mais antigos. Para mais detalhes, veja Unificação de palavras-chave de string de ligação e palavra-chave ConnectTimeout.

Para a referência completa de palavras-chave, veja ODBC DSN e palavras-chave de cadeia de ligação.