Microsoft ODBC 驱动 for SQL Server 的主要版本差异

本文介绍了Microsoft ODBC Driver 18 for SQL Server与版本17之间的破坏性变更。 当你选择驱动版本、将应用从版本17升级到版本18,或者需要让某个连接字符串在两个版本上保持一致时使用它。

大多数从版本17升级到版本18的应用程序只会受到一个变化的影响:连接默认加密。 如果升级后应用停止连接,先阅读 默认加密行为 。

选择版本17或版本18

Driver 18是目前的主要版本。 驱动17依然被支持,但使用该驱动的应用程序仍需使用驱动17系列的最新次要版本才能获得修复。 有关支持日期和维护规则,请参见 支持生命周期。

Scenario 建议的路径
新应用 从18号驾驶员开始。 在生产前配置加密和证书验证。
现有的驱动17应用 将驱动18与驱动17一起安装,更改连接字符串或DSN中的驱动名称,并明确设置Encrypt。 如果证书验证失败,修复服务器证书或客户端的信任存储。
需要 Encrypt=Strict、 HostnameInCertificate、 RetryExec,或另一个驱动18关键词的应用 使用支持该设置的Driver 18版本。 Driver 17 不接受 Strict 的 Encrypt 值,也不识别新关键词。
需要通过 ServerCertificate 使用带有 Encrypt=Strict. 的驱动 18.1 或更高版本。 驱动17不支持这个设置。

更改主要版本通常意味着更改你选择的驱动程序名称或包:

Platform 驾驶员17 18号驱动
连接字符串驱动名称 ODBC Driver 17 for SQL Server ODBC Driver 18 for SQL Server
Linux 软件包名称 msodbcsql17 msodbcsql18

更改摘要

默认和验证行描述了没有DSNEncrypt设置、SQL_COPT_SS_ENCRYPT属性或Windows强制协议加密覆盖的普通远程连接。 LocalDB 不是远程 TLS 目标。

区域 版本 17 版本18及以后版本
默认 Encrypt 设置 no,除非 Authentication 设置为非 none 或应用设置 SQL_COPT_SS_ACCESS_TOKEN的值;则 yes yes (18.0.1及以后版本)
Encrypt 公认的价值观 yes、no yes、no、Mandatory、Optional、Strict
加密模式 开着还是开 关、开或严
服务器证书验证 其中 Encrypt=yes;TrustServerCertificate=no,验证证书。 仅靠服务器要求的加密并不能选择验证。 默认会验证。 在非严格模式下,跳 TrustServerCertificate=yes 过正常验证,包括服务器需要加密时。
连接字符串关键字 基础套装 基础集加上新关键词

加密更改

默认加密行为

驱动程序17默认为, Encrypt=no 除非 Authentication 关键词设置为其他 none 值或应用程序设置 SQL_COPT_SS_ACCESS_TOKEN 了属性。 任一选择都会将默认值改为 yes。 显式的仍然 Encrypt=no 会关闭加密功能。 驱动18.0.1及以后默认为 Encrypt=yes。 比较版本时明确设置 Encrypt 。

全连接加密保护查询文本和结果以及登录信息。 有了 Encrypt=no,服务器仍然可以要求全连接加密。 当客户端和服务器都选择关闭加密时,非严格协商使用仅登录加密;这并不能保护后续应用数据。

当 Encrypt=yes;TrustServerCertificate=no时,两个驱动都选择正常的服务器证书验证。 如果只有服务器需要全连接加密( TrustServerCertificate=no 默认),驱动程序18会验证证书。 在严格模式之外 TrustServerCertificate=yes ,Driver 18跳过了该验证。 Driver 17 并不是仅仅因为服务器需求才进行验证。 Windows强制协议加密和内部证书验证回调路径不包含在本比较范围内。

在默认加密设置下,从17版本升级到18版本可能会暴露出不可信的服务器证书。 如果版本18拒绝该证书,请在更改认证设置前先诊断证书链和名称。

保持加密和服务器身份验证开启:

  • 配置一个有效的服务器证书和客户端的信任存储,使客户端信任其发出证书的授权机构。 用证书中的名称连接。
  • 如果你通过别名连接,请在服务器证书中设置 HostnameInCertificate 为有效名称。 这个设置并不能修复不可信的证书链。
  • 对于 Encrypt=Strict,驱动18.1及以后版本还支持 ServerCertificate 将服务器证书与证书文件匹配。 这个设置是钉钉证书;它不会指定主机名。 使用前请仔细查看 ODBC DSN 和 连接字符串 关键字中的限制。

注意

对于孤立的测试环境, Encrypt=yes;TrustServerCertificate=yes 请求加密但跳过服务器身份验证,使连接暴露于中间攻击者攻击的风险。 不要把它当作生产信托修复。 在严格模式下, TrustServerCertificate 会被忽略。

如果已有应用程序在受控兼容性测试中要求版本17默认状态,请参见 恢复版本17加密行为。 Encrypt=no 而且 Encrypt=optional 不要修复证书信任,可能会让应用数据保持未加密。

加密值

版本17只 yes 接受和 no。 第18版及以后版本接受这些数值,并增加了三个:

价值 等效于 Behavior
Mandatory yes 连接是加密的。
Optional no 它没有请求全连接加密。 服务器仍然可以要求它;仅登录加密并不是完整的会话保护。
Strict 没有 该连接采用TDS 8.0加密。 服务器必须支持 TDS 8.0,如 SQL Server 2022 及以后版本。

Strict 没有版本17的对应版本。 这是唯一选择TDS 8.0的数值,TDS 8.0在登录交换前协商加密,而非登录时。

恢复17版加密行为

在审查信任修复后,仅在允许未加密应用数据的受控兼容性测试中使用以下设置:

Encrypt=no

驱动18也支持 Encrypt=optional 此设置。 这两个值都不妨碍服务器要求加密。 测试后恢复预期的加密配置;不要将禁用加密作为证书信任的解决方案。

升级清单

  1. 包括选择驱动17的库存连接字符串、DSN、包引用和部署脚本。
  2. 在与生产环境匹配的测试环境中安装驱动18。
  3. 将每个连接字符串中的关键词更改Driver为ODBC Driver 18 for SQL Server,并更新或重建每个DSN以使用驱动18。 安装驱动18不会切换现有连接,因为标注驱动17的连接一直使用驱动17。
  4. 显式设置 Encrypt 。 配合普通证书验证使用 Encrypt=Mandatory 。 仅在服务器支持 TDS 8.0(如 SQL Server 2022 及更高版本)时使用Encrypt=Strict。 对于不支持 TDS 8.0 的服务器,请使用 Encrypt=Mandatory。
  5. 正常验证时,连接 TrustServerCertificate=no 并验证可信链和被接受的服务器名称。 对于带有严格文件钉顶的驱动18.1及更高版本,应核实准确的证书匹配和有效日期; TrustServerCertificate 严格模式下会被忽略。
  6. 运行应用程序的认证、查询、事务、批量复制、故障切换和重试路径。
  7. 在将失败视为认证或网络错误之前,请审查证书验证错误的诊断。
  8. 保持Driver 17的安装状态,并从第一步开始保留库存直到验证完成,这样你才能回 滚到版本17。

回滚到版本17

驱动17和驱动18是并排安装的,所以你可以回滚而无需卸载驱动18。 有关下载和安装的详细信息,请参见 SQL Server 的 ODBC 驱动下载。

  1. 确认每个客户端仍安装驱动17。
  2. 利用升级清单中的库存,将每个连接字符串中的关键词改Driver回。ODBC Driver 17 for SQL Server
  3. 更新或重新创建每个DSN以使用驱动17。
  4. 将包引用和部署脚本还原到 Driver 17 包,比如 msodbcsql17 在 Linux 上。
  5. 恢复EncryptTrustServerCertificate应用程序与驱动17时使用的值。 驱动程序17只 yes 接受和 no , Encrypt 不识别驱动程序18的关键词,如 HostnameInCertificate 或 ServerCertificate,因此移除添加的驱动程序18的值和关键词。 将别名关键词改回其Driver 17名称,并用SQLSetConnectAttr一个设置 SQL_ATTR_LOGIN_TIMEOUT的调用替换ConnectTimeout。 关于映射,请参见 New 连接字符串 关键字。

在将回滚视为完成前,先验证它:

  • 每个连接都报告司机17。 调用 SQLGetInfo ; SQL_DRIVER_VER其主要版本为 17。
  • 应用程序的认证、查询、事务、批量复制、故障切换和重试路径均成功。
  • 连接字符串和DSN中没有 Encrypt 为驱动18添加的值或关键词。

新的 连接字符串 关键字

版本18增加了以下连接字符串关键词,但版本17无法识别这些关键词。 其中一些是版本17支持的新名称,使用了不同关键词或属性,列在 版本17对应 栏中。

关键 字 最低版本 Purpose 版本17的对应版本
ConcatNullYieldsNull 18.6 控制连接空值是否会得到空值。 没有
ConnectTimeout 18.7 登录超时时间只需几秒。 如果应用也设置 SQL_ATTR_LOGIN_TIMEOUT,则该属性优先。 SQL_ATTR_LOGIN_TIMEOUT 属性,设为 SQLSetConnectAttr
FailoverPartner 18.7 指定数据库镜像的故障切换伙伴。 仅适用于Windows。 Failover_Partner 关键词
GetDataExtensions 18.0 控制驱动启用的 SQLGetData 扩展。 没有
HostnameInCertificate 18.0 指定主机名称,在服务器的TLS证书中验证。 没有
IpAddressPreference 18.1 指定驱动程序首先尝试的IP地址家族。 没有
LongAsMax 18.0 将长数据类型映射到其 max 对应数据。 没有
MultipleActiveResultSets 18.7 启用多个主动结果集(MARS)。 接受 Yes 或 No。 MARS_Connection 关键词
RetryExec 18.1 配置 针对失败查询的重试规则。 没有
ServerCertificate 18.1 指定证书文件以匹配服务器证书。Encrypt=Strict 没有
WorkstationID 18.7 指定发送给服务器的工作站名称。 WSID 关键词

MultipleActiveResultSets、 WorkstationID、 和 FailoverPartner 是将 ODBC 关键词名称 Microsoft.Data.SqlClient 与属性名称对齐的别名。 第18版也接受了旧名称。 详情请参见 连接字符串关键词统一 和 连接时间输出关键词。

完整关键词参考请参见 ODBC DSN 和 连接字符串 关键字。