在 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 驱动程序。
不能只使用 ODBC。链接服务器使用依赖于 OLEDB 接口的分布式查询。这不是可选的或可互换的 API。在该 API 之下可以是任何 OLEDB、ODBC 甚至 JDBC 提供程序,只要其实现支持 OLEDB 接口即可。例如,有一个用于 ODBC 的 OLEDB 提供程序,这是针对非 SQL Server 数据源运行 DQ 的最常见方法之一。SQL Server 本身支持 OLEDB,因此不需要额外的层。大多数/所有这些信息都可以在 Books Online 或 MSDN 中找到。
为什么只需要使用 ODBC?如果想要始终加密,建议您通过https://connect.microsoft.com/SQLServer/feedback/记录功能请求。我不知道是否支持通过 DQ 运行 AE 的场景。“调用 SQL Server”本质上成为“目标 SQL Server”的客户端,但您不能完全控制客户端,因为 DQ 不是您可以修改的东西。
如果是出于其他原因,请在此处分享详细信息,以便人们帮助提出替代解决方案。
链接服务器确实依赖于 OLEDB 接口,但 ODBC 驱动程序可以安全地在 SQL Server 服务器之间使用。(人们普遍认为微软不支持这种配置;这是一个神话。)
使用链接服务器使用 ODBC 驱动程序 11、13 或 13.1。
ODBC 13.1 驱动程序是一个更新,仍然使用“ODBC Driver 13 for SQL Server”驱动程序名称,而不是“ODBC Driver 13.1 for SQL Server”。
我发现,在我的测试中,使用完全限定的服务器名称似乎更可靠,尤其是在连接到 AG 时,但您始终可以只尝试使用服务器名称。
您可以测试服务器间 Kerberos 连接,但使用 OPENROWSET。我测试 Kerberos 的一种方法是使用从源服务器运行的简单查询:
如果您看到此错误,则需要在服务器之间配置 Kerberos:
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 中。)
如果您遇到任何问题,请告诉我,我会帮助您。