在托管 SQL 实例上设置链接服务器

Posted

技术标签:

【中文标题】在托管 SQL 实例上设置链接服务器【英文标题】:Setting up a linked server on a Managed SQL Instance 【发布时间】:2021-12-02 03:43:33 【问题描述】:

在已设置的 Azure 托管 SQL 实例上,我正在尝试设置一些链接服务器连接。

当我在登录到此 MI SQL 实例时通过 Management Studio 访问这些相同的数据库时,我可以毫无问题地访问我想要连接的数据库。

但是,当我创建链接服务器连接时,它没有提供我可以通过 Management Studio 访问的其他 SQL 实例上的数据库。

通过MS访问数据库的端口为1433。

我已经能够在 DEV SQL 实例上成功创建这些链接服务器连接。但是,DEV SQL 实例不是托管实例。它是安装了 SQL Server 的 Azure VM 服务器。

我的问题是,我是否需要对 SQL MI 做任何特别的事情来允许我想要设置的这些数据库?

我尝试使用默认端口 (1433),但没有成功。这是在使用 management studio 时用于连接到 DB 的端口。

它确实创建了链接服务器连接,但不提供我试图联系的那个数据库上的数据库和表。

由于它位于 Azure 中,对于 MI,我是否需要在 Azure 门户或托管实例的服务器上执行任何特殊操作?

我尝试连接的数据库是 SQL Server 2016 (SP2-CU17) (KB5001092) - 13.0.5888.11 (X64) Mar 19 2021 19:41:38 版权所有 (c) Microsoft Corporation Enterprise Edition ( 64 位)在 Windows Server 2012 R2 Standard 6.3(内部版本 9600:)(管理程序)上

任何帮助将不胜感激。

由于我尝试设置的服务器是托管 SQL 实例,因此有什么特别需要做的吗?

我收到一条错误消息:“在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。”我可以通过这个托管 SQL 实例上的管理工作室访问同一个实例,没问题。但我无法创建链接服务器连接。

这是我用来尝试创建链接服务器连接的方法:

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'LinkedServer_Name', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'IPAddress,1433', @catalog=N'DB_Name'
GO

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServer_Name',@useself=N'False',@locallogin=NULL,@rmtuser=N'user_name',@rmtpassword='password'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'collation compatible', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'data access', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'dist', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'pub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'rpc', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'rpc out', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'sub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'connect timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'collation name', @optvalue=null
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'lazy schema validation', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'query timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'use remote collation', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'LinkedServer_Name', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

【问题讨论】:

SQL 是一种语言,它没有实例。 糟了! SQL 具有已安装的实例。是的,结构化查询语言顾名思义就是一种“语言”。但是,SQL Server 也是一个已安装的平台。但是,如果您曾经使用过 SQL,您就会知道这一点。 是的,我知道 SQL 和 MS SQL Server 之间的区别。但其他一些则没有。最好说清楚。 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

如果您遇到连接问题 也许您需要检查您的托管实例网络配置 (NSG)。

检查您是否有连接 SQL 服务器的出站规则。 如果没有,您需要创建它。

【讨论】:

【参考方案2】:

托管实例支持链接服务器,除非它们使用 MSDTC 进行某些分布式写入。

Microsoft 分布式事务协调器 (MSDTC) 服务 监控交易过程的所有方面,甚至跨越不同的 多台机器上的资源管理器。这有助于保证 如果事务的所有部分都成功,或者它是 如果事务过程的任何元素失败,则回滚。

当用户注册到本地服务器并运行引用连接服务器上的表的分布式查询时,本地服务器必须代表用户登录到链接服务器才能访问该表。要指定本地服务器用于连接到链接服务器的登录凭据,请调用 sp_addlinkedsrvlogin。

确保您有远程登录:

EXEC master.dbo.sp_addlinkedsrvlogin   
    @rmtsrvname = N'SRVR002\ACCTG',   
    @locallogin = NULL ,   
    @useself = N'True' ;  
GO

//

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'PEER',@useself=N'False',@locallogin=NULL,
@rmtuser=N'$(linkedServerUsername)', @rmtpassword='$(linkedServerPassword)';

另外请检查sp_addlinkedserver中是否添加了目标用户的名字

    EXEC master.dbo.sp_addlinkedserver @server = N'<LINKED SERVER NAME>', 

@srvproduct=N'', @provider=N'SQLNCLI11', @provstr=N'Server=<SERVER_DNS_NAME>;Initial Catalog=master;Persist Security 

Info=False;MultipleActiveResultSets=FalseEncrypt=yes;TrustServerCertificate=yes;Connection Timeout=30;User ID=<TARGET USER>'

【讨论】:

谢谢。我已经做过几次了。但是,当我查看此服务器上存在的数据库时,它只显示默认值,这不是我尝试连接的数据库。是否需要在托管 SQL 实例 VM 上进行其他设置,以便 LS 连接查看我尝试连接的数据库?我可以通过 LS 连接到我试图在开发服务器上读取的服务器/数据库。但是,该开发服务器不是托管实例。

以上是关于在托管 SQL 实例上设置链接服务器的主要内容,如果未能解决你的问题,请参考以下文章

链接服务器在同一服务器上时双跳,差异服务器上的客户端?

OLE DB 提供程序“ADSDSOObject”尚未注册 - 在 Azure SQL 托管实例中

如何在 SQL 2000/2005 上设置与 Oracle 数据库的链接服务器?

将sybase存储过程作为链接服务器过程sql server 2008执行

SQL Server 2008 如何配置链接服务器访问 SQL Server2000?

使用sql azure连接ODBC进度