Sql-Server

如何保證在連結伺服器中使用 Microsoft ODBC Driver 13 for SQL Server?

  • July 25, 2017

在 SQL Server 2016 上,如何保證在連結伺服器中使用 Microsoft ODBC Driver 13 for SQL Server?我不介意那裡有另一個層,例如 MSDASQL 提供程序,但我確實希望 SQL Server 的 ODBC 驅動程序 13 最終成為與刪除實例的連接。

通過在 Windows 2016 Technical Preview 4 上對 SQL Server 2016 RC2 進行測試,都在空白 VM 上全新安裝,我可以使用 odbcad32 查看“ODBC Driver 13 for SQL Server”,版本為 2015.130.1300.275,文件名為 MSODBCSQL13.DLL。

版本和文件名在 64 位 odbcad32 螢幕以及來自 c:\windows\syswow64 的 32 位 odbcad32 螢幕中是相同的,所以我不認為這是一個 32 位與 64 位的問題(特別是因為驅動程序是由 SQL Server 2016 RC2 安裝的)。

例如,在 SQL 2014 上,要使用 Native Client 11,我會使用

EXEC master.dbo.sp_addlinkedserver @server = N'LinkName', @srvproduct=N'sql_server', @provider=N'SQLNCLI11', @datasrc=N'YourTargetServer'

在 SQL 2016 RC2 上,當我嘗試

EXEC master.dbo.sp_addlinkedserver @server = N'LinkName', @srvproduct=N'sql_server', @provider=N'MSODBCSQL13', @datasrc=N'YourTargetServer'

連結伺服器創建得很好,但是當我嘗試使用它時,我得到:

Msg 7403, Level 16, State 1, Line 7
The OLE DB provider "MSODBCSQL13" has not been registered.

我沒有任何運氣嘗試 SQL Server 的 ODBC Driver 13 Microsoft ODBC Driver 13 for SQL Server 的提供程序名稱

甚至嘗試組合 MSDASQL 提供程序名稱,來自

將 Always Encrypted 與 Windows ODBC 驅動程序sp_addlinkedserver (Transact-SQL)一起使用

甚至查看系統資料庫也沒有顯示我認識的提供商名稱。

請注意,實際上,當我為 SQL Server 選擇 ODBC Driver 13 時,使用 odbcad32 創建系統 DSN 確實可以成功測試,所以我知道它可以工作。

理想情況下,我只需要一個範例 sp_addlinkedserver 命令,在其中指定新的 ODBC 驅動程序。

連結伺服器確實依賴於 OLEDB 介面,但 ODBC 驅動程序可以安全地在 SQL Server 伺服器之間使用。(人們普遍認為微軟不支持這種配置;這是一個神話。)

使用連結伺服器使用 ODBC 驅動程序 11、13 或 13.1。

EXEC master.dbo.sp_addlinkedserver @server = N'LinkedServerName', @srvproduct=N'', @provider=N'MSDASQL', @provstr=N'DRIVER={ODBC Driver 13 for SQL Server};MultiSubnetFailover=Yes;ApplicationIntent=READONLY;Trusted_Connection=Yes;SERVER=FqnServerName;'

ODBC 13.1 驅動程序是一個更新,仍然使用“ODBC Driver 13 for SQL Server”驅動程序名稱,而不是“ODBC Driver 13.1 for SQL Server”。

我發現,在我的測試中,使用完全限定的伺服器名稱似乎更可靠,尤其是在連接到 AG 時,但您始終可以只嘗試使用伺服器名稱。

您可以測試伺服器間 Kerberos 連接,但使用 OPENROWSET。我測試 Kerberos 的一種方法是使用從源伺服器執行的簡單查詢:

SELECT * FROM OPENROWSET(N'MSDASQL', N'Driver={ODBC Driver 13 for SQL Server};Server=FqnServerName;Database=master;Trusted_Connection=yes;MultiSubNetFailover=yes;', N'SELECT * FROM [sys].[databases]') AS [Source]

如果您看到此錯誤,則需要在伺服器之間配置 Kerberos:

連結伺服器的 OLE DB 提供程序“MSDASQL”“(null)”返回消息“

$$ Microsoft $$$$ ODBC Driver 13 for SQL Server $$$$ SQL Server $$使用者“NT AUTHORITY\ANONYMOUS LOGON”登錄失敗。”。

2012 Native Client 現在(超過)五年了,已被 Microsoft 正式棄用,如果您想與 Microsoft 的路線圖保持一致,您將需要使用 ODBC。考慮到 2014 年,2012 年的 Native Client 才兩年。現在考慮添加到 SQL Server 2016 和 SQL Server 2017 且不受 2012 Native Client 支持的所有功能,並且您有一個使用 ODBC Driver 13.1 for SQL Server 的巨大案例。

自去年年中以來,我的組織一直在遷移到 SQL Server 2016,我們正在測試 SQL Server 2017 (CTP 2.1)。我一直在遷移我們所有的連結伺服器(至少那些指向 SQL Server 2016 或 SQL Server 2017 的伺服器)以使用 ODBC 驅動程序 13(或更準確地說,13.1),並且在一年多的測試中還沒有發現任何嚴重的問題針對 SQL Server 2016。

(為了充分披露,使用連結伺服器的圖表存在問題;我基於使用 ODBC 13.1 的連結伺服器向 Microsoft 報告了該問題,並且 Microsoft 確認連結伺服器(任何類型)不支持圖表表在 SQL Server 2017 中。)

如果您遇到任何問題,請告訴我,我會幫助您。

引用自:https://dba.stackexchange.com/questions/135221