更新时间:2023-10-07
链接服务器允许 Microsoft SQL Server 在其他数据库服务器实例上运行 SQL Server 语句。
注意: RDS SQL Server 当前不会将链接服务器复制到多可用区部署中的镜像数据库服务器(或 AlwaysOn 可用性组辅助服务器)。您可以在主实例上创建链接服务器,故障转移到高可用性服务器实例,然后再次创建链接服务器,以便它们位于 RDS SQL Server 的其他实例上。
在VPC网络场景中(托管云采用VPC网络),出站网络配置之前,链接服务器仅限于单个 VPC内。建议 RDS SQL Server 安装通常应该只能私下访问(即不直接暴露于 Internet)。如果 SQL Server 的 RDS 实例是私有实例(即不公开可用),则前提是需要与 RDS SQL Server 实例位于同一 VPC 中以进行连接。如果 RDS SQL Server 实例是公开可用的(即对公共 Internet 可用),则此方案也适用于任何 SQL Server 安装。
关于链接服务器的说明,请参考MSDN说明:
https://docs.microsoft.com/zh-cn/sql/relational-databases/linked-servers/create-linked-servers-sql-server-database-engine?view=sql-server-2017
示例中使用了,关于sp_addlinkedserver的说明参考MSDN:
https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-addlinkedserver-transact-sql?view=sql-server-2017
对于以下示例,您必须通过安全组使用适当的 TCP 端口来允许网络流量用于 SQL Server 的每个入站实例。换句话说,如果您本地库连接到远程库,则必须允许来自 本地实例的 IP 地址以及 SQL Server 用于侦听数据库通信的端口上的流量。
- 远程SQL Server数据库实例(被访问的数据库),创建用于数据库访问的登录名(linkuser),并赋予sysdamin权限(生产数据库不建议使用此权限,应最小化分配)。
USE [master]
GO
CREATE LOGIN [linkuser] WITH PASSWORD=N'Abcd#1234' , DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [linkuser]
GO
- 在本地数据库实例中创建访问远程,通常有两种方式指定远程电脑,一种是经server命名为IP地址,一种是在使用‘SQLNCLI’数据驱动,在数据源中指定远程服务器IP。
#case 1:服务名为远程数据库实例IP的数据库链接创建方式。
EXEC master.dbo.sp_addlinkedserver @server = N'10.5.54.22', @srvproduct=N'SQL Server';
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname =N'10.5.54.22', @useself=N'False',@locallogin=NULL,@rmtuser=N'linkuser',@rmtpassword='Abcd#1234';
GO
#case 2: 使用SQLNCLI驱动+数据源的方式创建数据库链接服务器。
EXEC master.dbo.sp_addlinkedserver @server = N'TEST', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'10.5.54.22';
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'TEST', @useself=N'False',@locallogin=NULL,@rmtuser=N'linkuser',@rmtpassword='Abcd#1234';
GO
- 尝试查询链接服务器中的数据库。当链接服务器就位后,您可以使用标准的四部分命名来引用远程服务器上的表、视图等
SELECT name FROM [TEST].master.sys.databases;
GO
- 删除数据库链接(失败时),此步骤不是创建后的必须操作,当需要删除时才需要执行此命令。
EXEC master.dbo.sp_dropserver @server=N'TEST', @droplogins= 'droplogins'
GO