本文說明 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 此設定。 這兩個值都不會阻止伺服器需要加密。 測試後恢復預期的加密設定;不要將禁用加密作為憑證信任的解決方案。
升級清單
- 選擇驅動程式 17 的庫存連接字串、DSN、套件參考及部署腳本。
- 在與生產環境相符的測試環境中安裝 Driver 18。
- 將每個 連接字串 中的關鍵字改
Driver為ODBC Driver 18 for SQL Server,並更新或重新建立每個 DSN 以使用 Driver 18。 安裝驅動程式 18 不會切換現有連線,因為標示為驅動程式 17 的連線會一直使用 Driver 17。 - 明確設定
Encrypt。 搭配一般的憑證驗證使用Encrypt=Mandatory。 僅在伺服器支援 TDS 8.0(如 SQL Server 2022 及更新版本)時使用Encrypt=Strict。 對於不支援 TDS 8.0 的伺服器,請使用Encrypt=Mandatory。 - 一般驗證時,連接
TrustServerCertificate=no並驗證受信任鏈及接受的伺服器名稱。 對於 Driver 18.1 及以後版本的嚴格檔案釘選,請改為確認精確的憑證匹配與有效日期;TrustServerCertificate嚴格模式下會忽略此功能。 - 執行應用程式的認證、查詢、交易、批量複製、故障轉移和重試路徑。
- 在將失敗視為認證或網路錯誤前,先檢視憑證驗證錯誤的診斷結果。
- 保持 Driver 17 的安裝狀態,並從第一步開始保留庫存直到驗證完成,這樣你才能回 滾到 17 版。
回滾回 17 版本
Driver 17 和 Driver 18 是並排安裝的,所以你可以回滾而不停用 Driver 18。 欲了解下載與安裝細節,請參閱下載 SQL Server 的 ODBC 驅動程式。
- 確認每個用戶端仍安裝 Driver 17。
- 利用升級清單中的庫存,將每個 連接字串 中的關鍵字改
Driver回ODBC Driver 17 for SQL Server。 - 更新或重新建立每個 DSN 以使用 Driver 17。
- 將套件參考與部署腳本還原至 Driver 17 套件,例如
msodbcsql17Linux 版本。 - 還原
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 與 連接字串 關鍵字。