创建链接服务器(SQL Server 数据库引擎)

适用于:SQL Server Azure SQL 托管实例

本文介绍如何创建链接服务器并访问其他 SQL Server(一个 Azure SQL 托管实例)中的数据或者通过使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 访问其他数据源中的数据。 通过链接服务器,SQL Server 数据库引擎和 Azure SQL 托管实例可从远程数据源中读取数据,并针对 SQL Server 实例之外的 OLE DB 数据源等远程数据库服务器执行命令。

背景

通常,配置链接服务器是为了支持数据库引擎在其他 SQL Server 实例或诸如 Oracle 等其他数据库产品上执行包含表的 Transact-SQL 语句。 许多类型的数据源都可配置为链接服务器,包括第三方数据库提供程序和 Azure CosmosDB。

在创建某一链接服务器后,可对该服务器运行分布式查询,并且查询可以联接来自多个数据源的表。 如果链接服务器定义为 SQL Server 实例或 Azure SQL 托管实例,则可执行远程存储过程。

链接服务器的功能和必需的参数可能会有很大差异。 本文中的示例是典型示例,但并未描述所有选项。 有关详细信息,请参阅 sp_addlinkedserver (Transact-SQL)

权限

在使用 Transact-SQL 语句时,需要在服务器上具有 ALTER ANY LINKED SERVER 权限,或需要具有 setupadmin 固定服务器角色中的成员身份。 使用 Management Studio 时,要求具有 CONTROL SERVER 权限,或者具有 sysadmin 固定服务器角色的成员身份。

使用 SSMS 创建链接服务器

通过以下过程使用 SSMS 创建链接服务器:

打开“新建链接服务器”对话框

在 SQL Server Management Studio (SSMS) 中:

  1. 打开对象资源管理器。
  2. 展开“服务器对象”。
  3. 右键单击“链接服务器”。
  4. 选择“新建链接服务器”。

编辑链接服务器属性的“常规”页

在“常规”页面上的“链接服务器”对话框中,键入要链接到“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 (Transact-SQL)

    • 位置
      根据 OLE DB 访问接口的说明,键入数据库的位置。

    • 目录
      键入在连接 OLE DB 访问接口时要使用的目录的名称。

编辑链接服务器属性的“安全性”页

在“安全性”页面上,指定在原始实例连接到链接服务器时所使用的安全性上下文。 这里要配置两种策略,两者可以单独使用,也可以组合使用。 第一种策略是将登录从本地服务器映射到远程服务器,第二种策略是链接服务器应该如何处理未映射的登录。

添加登录映射

可以选择指定如何使用链接服务器对特定的本地服务器登录进行身份验证。

在“本地服务器登录到远程服务器登录映射”下,对要映射的每个登录重复以下过程:

  1. 选择 添加

  2. 指定“本地登录”。

    指定可连接到链接服务器的本地登录。 本地登录可以是使用 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

  3. 选择“模拟”(可选)。

    将用户名和密码从本地登录传递到链接服务器。 对于 SQL Server 身份验证,远程服务器中必须存在名称和密码完全相同的登录。 对于 Windows 登录,登录必须是链接服务器中的有效登录。

    若要使用模拟功能,配置必须满足委托的要求。

  4. 如果不使用模拟,请指定“远程用户”。

    使用远程用户映射“本地登录”中定义的用户。 远程用户必须是远程服务器中的 SQL Server 身份验证登录。

  5. 如果不使用模拟,请指定“远程密码”。

    • 指定远程用户的密码。
  6. 若有需要,请选择“删除”以删除现有本地登录。

指定映射列表中不存在的登录的默认安全上下文

在通过使用其域登录名连接用户的域环境中,选择“使用登录名的当前安全上下文建立连接”通常是最佳选择 。 在用户通过使用 SQL Server 登录名连接到原始 SQL Server 时,最佳选择通常是选择 “通过使用此安全上下文” ,然后提供在链接服务器上进行身份验证时所必需的凭据。

选择以下选项之一:

  • 不建立连接
    不会对列表中未定义的登录建立连接。

  • 不使用安全上下文建立连接
    对于列表中未定义的登录,不使用安全上下文建立连接。

  • 使用登录当前的安全上下文建立连接
    对于列表中未定义的登录,使用登录的当前安全上下文建立连接。 如果使用 Windows 身份验证连接到本地服务器,则使用 Windows 凭据连接到远程服务器。 如果使用 SQL Server 身份验证连接到本地服务器,则在连接到远程服务器时需要使用登录名和密码。 在这种情况下,远程服务器中必须存在名称和密码完全相同的登录。

  • 使用此安全上下文建立连接
    对于列表中未定义的登录,使用“远程登录”和“使用密码”框中指定的登录名和密码建立连接 。 远程登录必须是远程服务器中的 SQL Server 身份验证登录。

    注意

    如果配置链接服务器时使用了“使用此安全性上下文”选项,则实例上的任何用户都将可以使用此上下文访问该远程链接服务器。 这可能会造成被滥用或恶意内部访问的意外风险。 对于向链接服务器提供的通过 SQL 身份验证的远程登录,应向其授予对该远程服务器的最低必要权限,以确保符合最低特权原则并减少攻击面。

编辑链接服务器属性中的“服务器选项”页(可选)

选择“服务器选项”页来查看或指定服务器选项。 可以编辑以下任一选项:

  • 排序规则兼容
    影响分布式查询在链接服务器上的执行。 如果该选项设置为 true,则 SQL Server 假定链接服务器中的所有字符在字符集和排序规则(或排序顺序)上与本地服务器兼容。 这使 SQL Server 得以将字符列上的比较发送给提供程序。 如果没有设置该选项,则 SQL Server 将始终在本地进行字符列上的比较。

    只有在确信链接服务器所对应的数据源与本地服务器有相同的字符集和排序顺序时,才应当设置该选项。

  • 数据访问
    启用和禁用链接服务器以进行分布式查询访问。

  • RPC
    从指定的服务器启用远程过程调用 (RPC)。

  • RPC Out
    对指定的服务器启用 RPC。

  • 使用远程排序规则
    确定是使用远程列的排序规则还是使用本地服务器的排序规则。

    如果为 True,则 SQL Server 数据源将使用远程列的排序规则,并且非SQL Server 数据源将使用排序规则名称指定的排序规则。

    如果为 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 (Transact-SQL)

保存链接服务器

选择“确定” 。

查看或编辑 SSMS 中的链接服务器提供程序选项

每个访问接口的选项都各不相同。 例如,某些类型的数据提供索引,有些则没有提供。 使用此对话框可以帮助 SQL Server 理解访问接口的功能。 SQL Server 安装某些常用的数据访问接口,但在提供数据的产品发生更改时, SQL Server 安装的访问接口可能不支持所有最新的功能。 提供数据的产品功能的有关信息的最佳来源是针对该产品的文档。
若要打开 SSMS 中的链接服务器“提供程序选项”页:

  1. 打开对象资源管理器。
  2. 展开“服务器对象”。
  3. 展开“链接服务器”。
  4. 展开“提供程序”。
  5. 右键单击一个提供程序,然后选择“属性”。

提供程序选项的定义方式如下:

  • 动态参数
    表明访问接口允许对参数化查询使用“?”参数标记语法。 仅当该访问接口支持 ICommandWithParameters 接口并支持“?”作为参数标记时,才应设置此选项。 如果设置了此选项,则允许 SQL Server 针对该访问接口执行参数化查询。 这种对访问接口执行参数化查询的能力会提高某些查询的性能。

  • 嵌套查询
    指示访问接口允许在 FROM 子句中使用嵌套的 SELECT 语句。 如果设置了此选项,则允许 SQL Server 将某些查询委托给需要在 FROM 子句中嵌套 SELECT 语句的访问接口。

  • 仅零级
    只对访问接口调用 0 级的 OLE DB 接口。

  • 允许进程内

    SQL Server 允许将访问接口实例化为进程内服务器。 如果未设置此选项,则默认行为是在 SQL Server 进程外实例化访问接口。 在 SQL Server 进程外实例化访问接口,可防止 SQL Server 进程在访问接口中出错。 在 SQL Server 进程外实例化访问接口时,不允许更新或插入长的引用列(textntextimage)。

  • 非事务更新
    SQL Server 允许更新,即使 ITransactionLocal 不可用时也是如此。 如果启用此选项,对访问接口的更新将不可恢复,因为该访问接口不支持事务。

  • 作为访问路径的索引
    SQL Server 尝试使用访问接口的索引来提取数据。 默认情况下,索引只能用于元数据而且从不打开。

  • 禁止即席访问
    SQL Server 不允许通过 OPENROWSET 和 OPENDATASOURCE 函数对 OLE DB 访问接口进行临时访问。 如果未设置此选项,则 SQL Server 同样不允许进行临时访问。

  • 支持 "Like" 运算符
    指示访问接口支持使用 LIKE 关键字的查询。

使用 Transact-SQL 创建链接服务器

若要通过使用 Transact-SQL 创建链接服务器,请使用 sp_addlinkedserver (Transact-SQL)CREATE LOGIN (Transact-SQL)sp_addlinkedsrvlogin (Transact-SQL) 语句。

此示例使用 Transact-SQL 创建与其他 SQL Server 实例的链接服务器:

  1. 在查询编辑器中,输入以下 Transact-SQL 命令以便链接到名为 SRVR002\ACCTG 的 SQL Server 实例:

    USE [master]  
    GO  
    EXEC master.dbo.sp_addlinkedserver   
        @server = N'SRVR002\ACCTG',   
        @srvproduct=N'SQL Server';  
    GO  
    
    
  2. 执行以下代码,以便将链接服务器配置为使用正在使用链接服务器的登录名的域凭据。

    EXEC 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 JOIN [SRVR002\ACCTG].master.sys.server_principals AS linked  
     ON local.name = linked.name;  
GO  

如果为链接服务器登录名返回了 NULL,则表示链接服务器上没有该登录名。 这些登录名将无法使用链接服务器,除非链接服务器配置为传递不同的安全性上下文或者链接服务器接受匿名连接。

包含 Azure SQL 托管实例的链接服务器

如果你使用的是 Azure SQL 托管实例,请参阅 sp_addlinkedserver (Transact-SQL) 中的以下示例:

后续步骤

若要详细了解如何管理链接服务器,请参阅以下文章: