Microsoft ODBC 驅動程式 for SQL Server 的主要版本差異

本文說明 Microsoft ODBC Driver 18 for SQL Server 與版本 17 之間的破壞性變更。 當你選擇驅動版本、將應用程式從版本 17 升級到 18,或需要讓 連接字串 在兩個版本中表現一致時,可以使用它。

大多數從版本 17 升級到 18 的應用程式會受到單一變更的影響:連線預設是加密的。 如果升級後應用程式停止連線,請先閱讀 預設加密行為 。

選擇版本 17 或版本 18

Driver 18 是目前的主要版本。 驅動程式 17 仍被支援,但使用它的應用程式仍需取得驅動程式 17 系列中最新的次要版本才能獲得修正。 有關支援日期與維修規則,請參見 支援生命週期。

Scenario 建議的路徑
新應用 從 Driver 18 開始。 在生產前先設定加密與憑證驗證。
現有的 Driver 17 應用 將驅動程式 18 與驅動程式 17 一起安裝,並在 連接字串 或 DSN 中更改驅動程式名稱,並明確設定Encrypt。 如果憑證驗證失敗,則修正伺服器憑證或客戶端的信任儲存。
需要 Encrypt=Strict、 HostnameInCertificate、 RetryExec,或其他 Driver 18 關鍵字的應用程式 使用支援此設定的 Driver 18 版本。 Driver 17 不接受 Strict 的 Encrypt 值,也不認識新的關鍵字。
需要憑證檔案釘選的應用程式 ServerCertificate 使用 Driver 18.1 或更新版本。Encrypt=Strict Driver 17 不支援這個設定。

更改主要版本通常意味著更改驅動程式名稱或你選擇的套件:

Platform 駕駛員17 駕駛員18
連線串驅動程式名稱 ODBC Driver 17 for SQL Server ODBC Driver 18 for SQL Server
Linux 套件名稱 msodbcsql17 msodbcsql18

變更的摘要

預設列與驗證列描述的是沒有 DSN Encrypt 設定、SQL_COPT_SS_ENCRYPT屬性或 Windows 強制加密覆蓋的普通遠端連線。 LocalDB 不是遠端的 TLS 目標。

Area 版本 17 版本 18 及以後版本
預設設定Encrypt no,除非 Authentication 設定為 或 應用程式設定SQL_COPT_SS_ACCESS_TOKEN的值none;則yes yes (18.0.1 及以後版本)
Encrypt 公認的價值觀 yes、no yes、、 no、 Mandatory、 Optional、 Strict
加密模式 關著還是開 關、開或嚴格
伺服器憑證驗證 其中 Encrypt=yes;TrustServerCertificate=no,驗證憑證。 僅靠伺服器要求加密並不代表驗證。 預設會驗證。 在非嚴格模式下,跳 TrustServerCertificate=yes 過一般的驗證,包括伺服器需要加密時。
連接字串關鍵字 基礎組 基礎集加上新關鍵字

加密方式變更

預設加密行為

除非關鍵字設定為 非 none 或應用程式設定屬性SQL_COPT_SS_ACCESS_TOKEN,否則 Authentication 17 預設為 。Encrypt=no 任一都會把預設值改成 yes。 明確的 還是 Encrypt=no 會關閉加密。 驅動程式 18.0.1 及之後預設為 Encrypt=yes。 比較版本時要明確設定 Encrypt 。

全連線加密保護查詢文字與結果,以及登入內容。 使用 Encrypt=no,伺服器仍可要求全連線加密。 當客戶端與伺服器雙方都選擇關閉加密時,非嚴格協商會使用僅登入加密;這不會保護後續的應用程式資料。

當 , Encrypt=yes;TrustServerCertificate=no兩個驅動程式都選擇正常的伺服器憑證驗證。 如果只有伺服器需要全連線加密( TrustServerCertificate=no 預設),Driver 18 會驗證憑證。 在 TrustServerCertificate=yes 外部嚴格模式下,驅動程式 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 版及以後版本接受這些數值,並新增三個數值:

價值 相當於 行為
Mandatory yes 連線是加密的。
Optional no 它不會要求全連線加密。 伺服器仍然可以要求它;僅登入加密並非完整的會話保護。
Strict 沒有 連線採用 TDS 8.0 加密。 伺服器必須支援 TDS 8.0,例如 SQL Server 2022 及更新版本。

Strict 沒有版本 17 的對應版本。 這是唯一選擇 TDS 8.0 的數值,因為加密是在登入交換前協商,而非交換中。

還原版本 17 的加密行為

在檢視信任修正後,僅在允許未加密應用程式資料的受控相容性測試時,使用以下設定:

Encrypt=no

驅動程式18也適用於 Encrypt=optional 此設定。 這兩個值都不會阻止伺服器需要加密。 測試後恢復預期的加密設定;不要將禁用加密作為憑證信任的解決方案。

升級清單

  1. 選擇驅動程式 17 的庫存連接字串、DSN、套件參考及部署腳本。
  2. 在與生產環境相符的測試環境中安裝 Driver 18。
  3. 將每個 連接字串 中的關鍵字改Driver為 ODBC Driver 18 for SQL Server,並更新或重新建立每個 DSN 以使用 Driver 18。 安裝驅動程式 18 不會切換現有連線,因為標示為驅動程式 17 的連線會一直使用 Driver 17。
  4. 明確設定 Encrypt 。 搭配一般的憑證驗證使用 Encrypt=Mandatory 。 僅在伺服器支援 TDS 8.0(如 SQL Server 2022 及更新版本)時使用Encrypt=Strict。 對於不支援 TDS 8.0 的伺服器,請使用 Encrypt=Mandatory。
  5. 一般驗證時,連接 TrustServerCertificate=no 並驗證受信任鏈及接受的伺服器名稱。 對於 Driver 18.1 及以後版本的嚴格檔案釘選,請改為確認精確的憑證匹配與有效日期; TrustServerCertificate 嚴格模式下會忽略此功能。
  6. 執行應用程式的認證、查詢、交易、批量複製、故障轉移和重試路徑。
  7. 在將失敗視為認證或網路錯誤前,先檢視憑證驗證錯誤的診斷結果。
  8. 保持 Driver 17 的安裝狀態,並從第一步開始保留庫存直到驗證完成,這樣你才能回 滾到 17 版。

回滾回 17 版本

Driver 17 和 Driver 18 是並排安裝的,所以你可以回滾而不停用 Driver 18。 欲了解下載與安裝細節,請參閱下載 SQL Server 的 ODBC 驅動程式。

  1. 確認每個用戶端仍安裝 Driver 17。
  2. 利用升級清單中的庫存,將每個 連接字串 中的關鍵字改Driver回 ODBC Driver 17 for SQL Server。
  3. 更新或重新建立每個 DSN 以使用 Driver 17。
  4. 將套件參考與部署腳本還原至 Driver 17 套件,例如 msodbcsql17 Linux 版本。
  5. 還原 Encrypt 應用程式在驅動程式 17 中使用的 和 TrustServerCertificate 值。 驅動程式 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 對應 欄位中。

Keyword 最低版本 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版也接受舊名稱。 詳情請參閱 Connection string 關鍵字統一 與 ConnectTimeout 關鍵字。

完整關鍵字參考,請參見 ODBC DSN 與 連接字串 關鍵字。