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

本主题演示如何使用 SQL Server Management Studio 或 Transact-SQL 创建链接服务器并从另一个 SQL Server 访问数据。 创建链接服务器可以处理来自多个源的数据。 链接服务器不必是 SQL Server 的另一个实例,而是一种常见方案。

背景

链接服务器允许访问针对 OLE DB 数据源的分布式异类查询。 创建链接服务器后,可以针对此服务器运行分布式查询,查询可以从多个数据源联接表。 如果链接服务器定义为 SQL Server 的实例,则可以执行远程存储过程。

链接服务器的功能和必需参数可能有很大差异。 本主题中的示例提供了一个典型示例,但未介绍所有选项。 有关详细信息,请参阅 sp_addlinkedserver (Transact-SQL)

安全

权限

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

如何创建链接服务器

可以使用以下任一项:

使用 SQL Server Management Studio

使用 SQL Server Management Studio 创建指向 SQL Server 的另一个实例的链接服务器
  1. 在 SQL Server Management Studio 中,打开对象资源管理器,展开 “服务器对象”,右键单击“ 链接服务器”,然后单击“ 新建链接服务器”。

  2. “常规 ”页上的 “链接服务器 ”框中,键入链接到的 SQL Server 实例的名称。

    SQL Server
    将链接服务器标识为 MicrosoftSQL Server 的实例。 如果使用此方法定义 SQL Server 链接服务器, 则链接服务器 中指定的名称必须是服务器的网络名称。 此外,从服务器检索到的任何表都来自为链接服务器上的登录名定义的默认数据库。

    其他数据源
    指定 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 访问接口建立连接时要使用的目录的名称。

    若要测试连接到链接服务器的能力,请在对象资源管理器中右键单击链接服务器,然后单击“ 测试连接”。

    注释

    如果 SQL Server 实例是默认实例,请输入承载 SQL Server 实例的计算机的名称。 如果 SQL Server 是命名实例,请输入计算机的名称和实例的名称,例如 Accounting\SQLExpress

  3. “服务器类型 ”区域中,选择 “SQL Server ”以指示链接服务器是 SQL Server 的另一个实例。

  4. “安全 ”页上,指定在原始 SQL Server 连接到链接服务器时将使用的安全上下文。 在用户使用其域登录名进行连接的域环境中,选择通过登录名的当前安全上下文进行通常是最佳选择。 当用户使用 SQL Server 登录名连接到源 SQL Server 时,通常最佳选择是选择 使用此安全上下文,并提供用于链接服务器身份验证的必要凭据。

    本地登录
    指定可连接到链接服务器的本地登录名。 本地登录可以是使用 SQL Server 身份验证的登录或使用 Windows 身份验证的登录。 使用此列表可以限制与特定登录名的连接,或允许某些登录名作为其他登录名进行连接。

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

    若要使用模拟,配置必须满足委派的条件。

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

    远程密码
    指定远程用户的密码。

    添加
    添加新的本地登录名。

    删除
    删除现有的本地登录名。

    未制作
    指定不会为列表中未定义的登录名建立连接。

    无需使用安全上下文即可进行创建
    指定在不使用列表中未定义的登录名的安全上下文的情况下建立连接。

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

    在此安全上下文中进行
    指定将使用在 远程登录密码 框中指定的登录名和密码进行连接,适用于列表中未定义的登录名。 远程登录必须是远程服务器上的 SQL Server 身份验证登录名。

  5. (可选)若要查看或指定服务器选项,请单击“ 服务器选项” 页。

    兼容排序规则
    影响针对链接服务器的分布式查询执行。 如果此选项设置为 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)。

  6. 单击 “确定”

查看服务选项
  • 若要查看提供程序可用的选项,请单击“ 提供程序选项” 页。

    所有提供程序都没有相同的可用选项。 例如,某些类型的数据具有可用的索引,有些数据可能不可用。 使用此对话框可帮助 SQL Server 了解提供程序的功能。 SQL Server 会安装一些常见的数据提供程序,但是当产品提供数据更改时,SQL Server 安装的提供程序可能不支持所有最新功能。 提供数据的产品功能的最佳信息来源是该产品的文档。

    动态参数
    指示提供程序允许参数化查询使用“?”参数标记语法。 仅当提供程序支持 ICommandWithParameters 接口并支持“?”作为参数标记时,才设置此选项。 通过设置此选项,SQL Server 可以对提供程序执行参数化查询。 能够对提供程序执行参数化查询,从而为某些查询提供更好的性能。

    嵌套查询
    指示提供程序允许嵌套的 SELECT 语句在 FROM 子句中。 通过设置此选项,SQL Server 可以将某些查询委托给需要 FROM 子句中嵌套 SELECT 语句的提供程序。

    仅限零级
    仅调用级别 0 OLE DB 接口来访问提供程序。

    允许进程内操作
    SQL Server 允许将提供程序实例化为进程内服务器。 如果未设置此选项,默认行为是实例化 SQL Server 进程外部的提供程序。 实例化 SQL Server 进程外部的提供程序可保护 SQL Server 进程免受提供程序中的错误的影响。 在 SQL Server 进程外部实例化提供程序时,不允许更新或插入涉及长列(如 textntextimage)。

    未完成事务的更新
    即使 ITransactionLocal 不可用,SQL Server 也允许更新。 如果启用此选项,则无法恢复针对提供程序的更新,因为提供程序不支持事务。

    索引作为访问路径
    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\ACCTGSQL 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  
    
    

跟进:创建链接服务器后要执行的步骤

测试已连接的服务器

  • 执行以下代码以测试与链接服务器的连接。 此示例返回链接服务器上的数据库的名称。

    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 时,它指示该登录名不存在于链接服务器上。 除非链接服务器配置为传递其他安全上下文或链接服务器接受匿名连接,否则这些登录名将无法使用链接服务器。

另请参阅

链接服务器(数据库引擎)
sp_addlinkedserver(Transact-SQL)
sp_serveroption(Transact-SQL)