本文介绍如何使用 SQL Server Management Studio(SSMS) 或 Transact-SQL 创建链接服务器,以及从另一个 SQL Server、Azure SQL 托管实例或其他数据源访问数据。 通过链接服务器,SQL Server 数据库引擎和 Azure SQL 托管实例可从远程数据源中读取数据,并针对 SQL Server 实例之外的 OLE DB 数据源等远程数据库服务器执行命令。
背景
通常,配置链接服务器是为了支持数据库引擎在其他 SQL Server 实例或诸如 Oracle 等其他数据库产品上执行包含表的 Transact-SQL 语句。 许多类型的数据源都可配置为链接服务器,包括第三方数据库提供程序和 Azure CosmosDB。
在创建某一链接服务器后,可对该服务器运行分布式查询,并且查询可以联接来自多个数据源的表。 如果链接服务器定义为 SQL Server 实例或 Azure SQL 托管实例,则可执行远程存储过程。
链接服务器的功能和必需的参数可能会有很大差异。 本文中的示例是典型示例,但并未描述所有选项。 有关详细信息,请参阅 sp_addlinkedserver。
权限
使用 Transact-SQL 语句时,需要具有服务器上的ALTER ANY LINKED SERVER权限或属于setupadmin固定服务器角色的成员。 使用 Management Studio 时,需要具有 CONTROL SERVER 固定服务器角色的权限或成员身份。
使用 SSMS 创建链接服务器
通过以下过程使用 SSMS 创建链接服务器:
打开“新建链接服务器”对话框
在 SQL Server Management Studio (SSMS) 中:
- 打开对象资源管理器。
- 展开 服务器对象。
- 右键单击链接服务器。
- 选择“新建链接服务器”。
编辑链接服务器属性的“常规”页面
在“常规”页面上的“链接服务器”对话框中,键入要链接到“SQL Server”的实例名称。
注意
如果该 SQL Server 实例是默认实例,则输入承载 SQL Server实例的计算机的名称。 如果该 SQL Server 是命名实例,则输入计算机名称和实例名称,例如 Accounting\SQLExpress。
根据需要指定“服务器类型”以及相关信息:
SQL Server
将链接服务器标识为 Microsoft SQL Server 实例或 Azure SQL 托管实例。 如果使用此方法来定义某个链接服务器,则在“链接服务器”中指定的名称必须是该服务器的网络名称。 另外,从该服务器上检索的所有表都来自该链接服务器上为相应登录名所定义的默认数据库。
其他数据源
指定 SQL Server以外的 OLE DB 服务器类型。 选择此选项可激活选项。
提供程序
从列表框中选择 OLE DB 数据源。 OLE DB 提供程序已在注册表中以给定的 PROGID 注册。
产品名称
键入要作为链接服务器添加的 OLE DB 数据源的产品名称。
数据源
键入 OLE DB 提供程序解释的数据源名称。 如果要连接到 SQL Server的实例,请提供实例名称。
访问接口字符串
键入与该数据源对应的 OLE DB 提供程序的唯一编程标识符 (PROGID)。 要查看有效的提供程序字符串示例,请参阅 sp_addlinkedserver。
位置
按 OLE DB 提供程序解释的方式键入数据库位置。
目录
键入在连接 OLE DB 访问接口时要使用的目录的名称。
编辑链接服务器属性的“安全性”页
在“安全性”页面上,指定在原始实例连接到链接服务器时所使用的安全性上下文。 这里要配置两种策略,两者可以单独使用,也可以组合使用。 第一种策略是将登录从本地服务器映射到远程服务器,第二种策略是链接服务器应该如何处理未映射的登录。
添加登录映射
可以选择指定如何使用链接服务器对特定的本地服务器登录进行身份验证。
在“本地服务器登录到远程服务器登录映射”下,对要映射的每个登录重复以下过程:
选择 添加 。
指定“本地登录”。
指定可连接到链接服务器的本地登录。 本地登录可以是使用 SQL Server 身份验证的登录,也可以是使用 Windows 身份验证的登录。 不支持使用 Windows 组或包含的数据库用户。 使用此列表可以将连接限定为特定的登录,也可以允许某些登录使用其他登录名进行连接。
注意
使用 Windows 身份验证访问远程 SQL Server 实例的链接服务器的常见问题源于服务主体名称 (SPN) 的问题。 有关详细信息,请参阅客户端连接中的服务主体名称 (SPN) 支持。 Microsoft Kerberos Configuration Manager for SQL Server 是一款诊断工具,可帮助解决与 Kerberos Configuration Manager for SQL Server 相关的连接问题。 有关详细信息,请参阅 Microsoft Kerberos Configuration Manager for SQL Server。
选择模拟身份(可选)。
将用户名和密码从本地登录传递到链接服务器。 对于 SQL Server 身份验证,远程服务器中必须存在名称和密码完全相同的登录。 对于 Windows 登录,登录必须是链接服务器中的有效登录。
若要使用模拟功能,配置必须满足委托的要求。
如果不使用身份模拟,请指定远程用户。
使用远程用户映射“本地登录”中定义的用户。 远程用户必须是远程服务器中的 SQL Server 身份验证登录。
如果不使用模拟用户,请指定远程密码。
指定远程用户的密码。
若有需要,请选择“删除”以删除现有本地登录。
指定映射列表中不存在的登录的默认安全上下文
在用户使用其域登录名进行连接的域环境中,选择 使用登录名的当前安全上下文建立 通常是最佳选择。 在用户通过使用 SQL Server 登录名连接到原始 SQL Server 时,最佳选择通常是选择 “通过使用此安全上下文” ,然后提供在链接服务器上进行身份验证时所必需的凭据。
选择以下选项之一:
不会创建
对于列表中未定义的登录名,不会建立连接。
在不使用安全上下文的情况下进行
无需对列表中未定义的登录名使用安全上下文即可建立连接。
使用登录的当前安全上下文创建
使用列表中未定义的登录名的当前安全上下文建立连接。 如果使用 Windows 身份验证连接到本地服务器,则 Windows 凭据用于连接到远程服务器。 如果使用 SQL Server 身份验证连接到本地服务器,则登录名和密码用于连接到远程服务器。 在这种情况下,远程服务器中必须存在名称和密码完全相同的登录。
使用此安全上下文建立连接
对于未在列表中定义的登录,将使用在远程登录框和密码框中指定的登录名和密码进行连接。 远程登录必须是远程服务器中的 SQL Server 身份验证登录。
注意
如果配置链接服务器时使用了“使用此安全性上下文”选项,则实例上的任何用户都将可以使用此上下文访问该远程链接服务器。 这可能会造成意外的滥用或恶意内部访问。 对于向链接服务器提供的通过 SQL 身份验证的远程登录,应向其授予对该远程服务器的最低必要权限,以确保符合最低特权原则并减少攻击面。
编辑链接服务器属性中的“服务器选项”页(可选)
选择“服务器选项”页来查看或指定服务器选项。 可以编辑以下任一选项:
排序规则兼容
影响分布式查询在链接服务器上的执行。 如果该选项设置为 true,则 SQL Server 假定链接服务器中的所有字符在字符集和排序规则(或排序顺序)上与本地服务器兼容。 这使 SQL Server 得以将字符列上的比较发送给提供程序。 如果未设置此选项,则 SQL Server 始终在本地对字符列比较进行求值。
只有在确信链接服务器所对应的数据源与本地服务器有相同的字符集和排序顺序时,才应当设置该选项。
数据访问
启用和禁用链接服务器以进行分布式查询访问。
RPC
从指定的服务器启用远程过程调用 (RPC)。
RPC 输出
对指定的服务器启用 RPC。
使用远程排序规则
确定使用远程服务器上的列排序规则还是使用本地服务器的排序规则。
如果为 true,则对于 SQL Server 数据源,将使用远程列的排序规则;对于非 SQL Server 数据源,将使用由 collation name 指定的排序规则。
如果为 false,分布式查询始终使用本地服务器的默认排序规则,同时忽略排序规则名称和远程列的排序规则。 默认值为 false。
排序规则名称
如果“使用远程排序规则”为 True,并且数据源不是 SQL Server 数据源,则应指定远程数据源使用的排序规则名称。 此名称必须是 SQL Server 支持的排序规则之一。
如果访问的是 SQL Server以外的 OLE DB 数据源,但该数据源的排序规则与 SQL Server 的某个排序规则匹配,则使用该选项。
链接服务器必须支持一种单一排序规则,供该服务器中的所有列使用。 如果链接服务器支持单个数据源内的多个排序规则,或者如果无法确定链接服务器的排序规则是否与 SQL Server 的某个排序规则匹配,则不要设置该选项。
连接超时
连接到链接服务器的超时值(以秒为单位)。
如果
0,则使用sp_configure远程登录超时选项的默认值。查询超时值
针对链接服务器的查询的超时值(以秒为单位)。
如果为
0,请使用sp_configure远程查询超时 选项的默认值。启用分布式事务处理的升级
使用该选项可通过 Microsoft 分布式事务处理协调器 (MS DTC) 事务保护服务器到服务器的操作过程。 如果该选项是 TRUE,则调用远程存储过程将启动分布式事务,并用 MS DTC 登记该事务。 有关详细信息,请参阅 sp_serveroption。
保存链接服务器
选择“确定” 。
在 SSMS 中查看或编辑链接服务器提供程序选项
并非所有提供方都提供相同的选项。 例如,某些类型的数据提供索引,有些则没有提供。 使用此对话框帮助 SQL Server 了解该提供程序的能力。 SQL Server 安装某些常用的数据访问接口,但在提供数据的产品发生更改时, SQL Server 安装的访问接口可能不支持所有最新的功能。 提供数据的产品功能的有关信息的最佳来源是针对该产品的文档。
若要在 SSMS 中打开链接服务器的 Providers Options 页:
- 打开对象资源管理器。
- 展开 服务器对象。
- 展开链接服务器。
- 展开 提供程序。
- 右键单击一个提供程序,然后选择“属性”。
提供程序选项定义如下:
动态参数
指示提供程序允许使用
?参数标记的语法来进行参数化查询。 仅当提供程序支持 ICommandWithParameters 接口并支持?作为参数标记时,才设置此选项。 设置此选项可使 SQL Server 能够针对该提供程序执行参数化查询。 能够对提供程序执行参数化查询,可使某些查询获得更好的性能表现。嵌套查询
指示提供程序允许在
FROM子句中嵌套SELECT语句。 设置此选项后,SQL Server 能够将某些需要在FROM子句中嵌套SELECT语句的查询委托给该提供程序。仅限零级
仅针对该提供程序调用 0 级 OLE DB 接口。
允许在进程内运行
SQL Server 允许将该提供程序实例化为进程内服务器。 如果未设置此选项,则默认情况下会在 SQL Server 进程外实例化该提供程序。 在 SQL Server 进程外实例化提供程序,可保护 SQL Server 进程不受提供程序中的错误影响。 当提供程序在 SQL Server 进程外部实例化时,不允许执行引用长列(text、ntext 或 image)的更新或插入操作。
非事务性更新
SQL Server 允许更新,即使 ITransactionLocal 不可用时也是如此。 如果启用此选项,则对该提供程序执行的更新将无法恢复,因为该提供程序不支持事务。
作为访问路径的索引
SQL Server 尝试使用提供程序的索引来提取数据。 默认情况下,索引只能用于元数据而且从不打开。
禁止即席访问
SQL Server 不允许通过 OPENROWSET 和 OPENDATASOURCE 函数对 OLE DB 提供程序进行即席访问。 如果未设置此选项,则 SQL Server 同样不允许进行临时访问。
支持 "Like" 运算符
指示提供程序支持使用
LIKE关键字的查询。
使用 Transact-SQL 创建链接服务器
若要使用 Transact-SQL 创建链接服务器,请使用 sp_addlinkedserverCREATE LOGIN 和 sp_addlinkedsrvlogin 语句。
此示例使用 Transact-SQL 创建与其他 SQL Server 实例的链接服务器:
在查询编辑器中,输入以下 Transact-SQL 命令以便链接到名为
SRVR002\ACCTG的 SQL Server 实例:USE [master]; GO EXECUTE master.dbo.sp_addlinkedserver @server = N'SRVR002\ACCTG', @srvproduct = N'SQL Server'; GO执行以下代码,将链接服务器配置为使用当前使用该链接服务器的登录账户的域凭据。
EXECUTE master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'SRVR002\ACCTG', @locallogin = NULL, @useself = N'True'; GO
跟进:创建链接服务器后要执行的步骤
以下步骤有助于验证链接服务器。
测试链接服务器
请考虑使用以下两种方法之一在当前的安全上下文中测试链接服务器的身份验证。
若要测试连接到 SSMS 中的链接服务器的能力,请在 对象资源管理器中浏览到链接服务器,右键单击链接服务器,然后选择“ 测试连接”。
若要测试连接到 T-SQL 中的链接服务器的能力,请执行基本
SELECT语句,例如,检索基本数据库目录信息。 以下示例返回链接服务器上数据库的名称。SELECT name FROM [SRVR002\ACCTG].master.sys.databases; GO
联接来自链接服务器的表
使用由四部分组成的名称引用链接服务器上的对象。 执行以下代码,以便返回本地服务器上所有登录名的列表及其在链接服务器上的匹配登录名。
SELECT local.name AS LocalLogins,
linked.name AS LinkedLogins
FROM master.sys.server_principals AS local
LEFT OUTER JOIN [SRVR002\ACCTG].master.sys.server_principals AS linked
ON local.name = linked.name;
GO
如果为链接服务器登录名返回了 NULL,则表示链接服务器上没有该登录名。 除非链接服务器配置为传递其他安全上下文,或者链接服务器接受匿名连接,否则这些登录帐户无法使用链接服务器。
与 Azure SQL 托管实例链接的服务器
如果使用 Azure SQL 托管实例,请参阅 sp_addlinkedserver中的以下示例: