链接服务器(数据库引擎)

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

通过链接服务器,SQL Server 数据库引擎和 Azure SQL 托管实例可从远程数据源中读取数据,并针对 SQL Server 实例之外的 OLE DB 数据源等远程数据库服务器执行命令。 通常,配置链接服务器是为了支持数据库引擎在其他 SQL Server 实例或诸如 Oracle 等其他数据库产品上执行包含表的 Transact-SQL 语句。 许多类型的 OLE DB 数据源都可配置为链接服务器,包括第三方数据库提供程序和 Azure Cosmos DB。

注意

SQL Server 和 Azure SQL 托管实例中提供链接服务器(但有一些限制)。 Azure SQL 数据库中不提供链接服务器。

何时使用链接服务器?

通过链接服务器,能够实现可在其他数据库中提取和更新数据的分布式数据库。 对于需要实现数据库分片的场景,链接服务器是很好的解决方案,让你无需创建自定义应用程序代码或从远程数据源直接加载。 链接服务器具有以下优点:

  • 能够访问 SQL Server 之外的数据。

  • 能够对企业内的异类数据源发出分布式查询、更新、命令和事务。

  • 能够以相似的方式确定不同的数据源。

你可以使用 SQL Server Management Studio 或使用 sp_addlinkedserver 语句配置链接服务器。 OLE DB 访问接口的类型和所需的参数的数量大不相同。 例如,一些提供程序要求你使用 sp_addlinkedsrvlogin 为连接提供一个安全性上下文。 某些 OLE DB 提供程序允许 SQL Server 更新 OLE DB 源上的数据。 其他访问接口可能仅提供只读数据访问权限。 有关每个 OLE DB 访问接口的信息,请查看该 OLE DB 访问接口的文档。

链接服务器组件

链接服务器定义指定了下列对象:

  • OLE DB 访问接口

  • OLE DB 数据源

“OLE DB 访问接口” 是管理特定数据源并与其交互的 DLL。 “OLE DB 数据源” 标识可通过 OLE DB 访问的特定数据库。 虽然通过链接服务器定义查询的数据源通常是数据库,但 OLE DB 访问接口对各种文件和文件格式仍可用。 这些文件和文件格式包括文本文件、电子表格数据和全文内容搜索的结果。

从 SQL Server 2019 (15.x) 开始,Microsoft OLE DB Driver for SQL Server (PROGID: MSOLEDBSQL) 是默认的 OLE DB 提供程序。 在早期版本中,SQL Server Native Client (PROGID: SQLNCLI11) 是默认的 OLE DB 提供程序。

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除 SQL Server Native Client(通常缩写为 SNAC)。 不建议在新的开发工作中使用 SQL Server Native Client OLE DB 提供程序(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 此后请切换到新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server

只有在使用 32 位 Microsoft.JET.OLEDB.4.0 OLE DB 提供程序时,Microsoft 才支持连接到 Microsoft Access 和 Excel 源的链接服务器。

注意

SQL Server 分布式查询旨在与任何实现所需 OLE DB 接口的 OLE DB 提供程序一起使用。 但是,已针对默认 OLE DB 提供程序测试了 SQL Server。

链接服务器详细信息

下图显示了链接服务器配置的基础。

显示客户端层、服务器层和数据库服务器层的关系图。

通常,链接服务器用于处理分布式查询。 当客户端应用程序通过链接服务器执行分布式查询时,SQL Server 将分析命令并向 OLE DB 发送请求。 行集请求的形式可以是对该访问接口执行查询或从该访问接口打开基表。

注意

为使数据源能通过链接服务器返回数据,该数据源的 OLE DB 提供程序 (DLL) 必须与 SQL Server 的实例位于同一服务器上。

重要

使用 OLE DB 提供程序时,运行 SQL Server 服务的帐户必须具有对安装提供程序的目录及其所有子目录的读取权限和执行权限。 这包括 Microsoft 发布的提供程序和任何第三方提供程序。

注意

使用完全委派时,链接服务器支持 Active Directory 传递身份验证。 自 SQL Server 2017 (14.x) CU17 起,还支持使用约束委派的直通身份验证;但是,不支持基于资源的约束委派

管理提供程序

有一组选项可以控制 SQL Server 如何加载和使用注册表中指定的 OLE DB 提供程序。

管理链接服务器定义

设置链接服务器时,请通过 SQL Server 注册连接信息和数据源信息。 完成注册后,可以用单个逻辑名称来引用该数据源。

可以使用存储过程和目录视图来管理链接服务器定义:

  • 通过运行 sp_addlinkedserver 创建链接服务器定义。

  • 通过对 sys.servers 系统目录视图运行查询,查看有关在 SQL Server 的特定实例中定义的链接服务器的信息。

  • 通过运行 sp_dropserver 删除链接服务器定义。 还可以使用此存储过程删除远程服务器。

还可以使用 SQL Server Management Studio 定义链接服务器。 在对象资源管理器中,右键单击“服务器对象”,选择“新建”,再选择“链接服务器”。 通过右键单击链接服务器名称并选择“删除”,可以删除链接服务器定义。

对链接服务器执行分布式查询时,请对每个要查询的数据源指定由四个部分组成的完全限定的表名。 这个四部分名称格式应为 linked_server_name.catalog.schema.object_name

注意

可以定义链接服务器指回(环回)到在其上定义它们的服务器。 当在单服务器网络中测试使用分布式查询的应用程序时,环回服务器是很有用的。 环回链接服务器专用于测试,许多操作(如分布式事务)不支持该服务器。

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

Azure SQL 托管实例链接服务器支持使用 Microsoft Entra ID(以前称为 Azure Active Directory)进行 SQL 身份验证和身份验证。

若要使用 Azure SQL 托管实例上的 SQL 代理作业通过链接服务器查询远程服务器,请使用 sp_addlinkedsrvlogin 创建从本地服务器上的登录到远程服务器上登录的映射。 当 SQL 代理作业通过链接服务器连接到远程服务器时,会在远程登录的上下文中执行 T-SQL 查询。 有关详细信息,请参阅使用 Azure SQL 托管实例的 SQL 代理作业

Microsoft Entra 身份验证

两种受支持的 Microsoft Entra 身份验证模式为:托管标识和直通。 托管标识身份验证可用于允许本地登录名查询远程链接服务器。 直通身份验证允许可使用本地实例进行身份验证的主体通过链接服务器访问远程实例。

若要在 Azure SQL 托管实例中对链接服务器使用 Microsoft Entra 直通身份验证,需要满足以下先决条件:

  • 将同一主体添加为远程服务器上的登录。
  • 这两个实例都是 SQL 信任组的成员。

注意

为直通模式配置的链接服务器的现有定义支持 Microsoft Entra 身份验证。 其唯一要求是将 SQL 托管实例添加到服务器信任组

以下限制适用于 Azure SQL 托管实例上链接服务器的 Microsoft Entra 身份验证:

  • 不同 Microsoft Entra 租户中的 SQL 托管实例不支持 Microsoft Entra 身份验证。
  • 仅 OLE DB 驱动程序版本 18.2.1 及更高版本才支持链接服务器的 Microsoft Entra 身份验证。

MSOLEDBSQL19 和链接服务器

目前,MSOLEDBSQL19 阻止创建没有加密和可信证书的链接服务器(自签名证书还不够)。 如果需要链接服务器,请使用现有受支持的 MSOLEDBSQL 版本。