Linked Server简介
我们日常使用SQL Server数据库时,经常遇到需要在实例Instance01中跨实例访问Instance02中的数据。例如在做数据迁移时,如下语句:
insert into Instance01.DB01.dbo.Table01
select * from Instance02.DB01.dbo.Table01
普通情况下,这样做是不允许的,因为SQL Server默认不可以跨实例访问数据。解决方案是使用存储过程sp_addlinkedserver进行实例注册。
链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。在创建某一链接服务器后,可对该服务器运行分布式查询,并且查询可以联接来自多个数据源的表。如果链接服务器定义为 SQL Server 实例,则可执行远程存储过程。链接服务器具有以下优点:
- 能够访问 SQL Server之外的数据。
- 能够对企业内的异类数据源发出分布式查询、更新、命令和事务。
- 能够以相似的方式确定不同的数据源。
Linked Server组件
链接服务器定义指定了下列对象:
- OLE DB 访问接口
- OLE DB 数据源
“OLE DB 访问接口” 是管理特定数据源并与其交互的 DLL。 “OLE DB 数据源” 标识可通过 OLE DB 访问的特定数据库。 虽然通过链接服务器定义查询的数据源通常是数据库,但 OLE DB 访问接口对各种文件和文件格式仍可用。 这些文件和文件格式包括文本文件、电子表格数据和全文内容搜索的结果。
Microsoft SQL Server本机客户端 OLE DB 访问接口 (PROGID: SQLNCLI11) 是 SQL Server 的正式 OLE DB 访问接口。
通常,链接服务器用于处理分布式查询。 当客户端应用程序通过链接服务器执行分布式查询时, SQL Server 将分析命令并向 OLE DB 发送请求。 为使数据源能通过链接服务器返回数据,该数据源的 OLE DB 访问接口 (DLL) 必须与 SQL Server 的实例位于同一服务器上
Linked Server的安全性
当用户登录到本地服务器并执行分布式查询,以访问链接服务器上的表时,本地服务器必须登录链接服务器上,代表该用户访问该表。使用存储过程sp_addlinkedsrvlogin来指定本地服务器用于登录链接服务器的登录凭据。
例如,使用远程密码 8r4li034j7$ 为链接服务器 S1 建立了一个从本地登录名 U1 到远程登录名 U2 的映射(如在SQL Server中使用sa账户登录到远程oracle服务器的sys账户)。在本地登录名 U1 执行访问链接服务器 S1 中存储的表的分布式查询时,如果 SQL Server 连接到链接服务器 S1,则将 U2 和 8r4li034j7$ 分别作为用户 ID 和密码进行传递。
本地服务器上的所有登录和链接服务器上的远程登录之间的默认映射通过执行 sp_addlinkedserver 自动创建。默认映射表示,当代表本地登录连接到链接服务器时,SQL Server 使用本地登录的用户凭据。这相当于在链接服务器的 @useself 设置为 true 的情况下执行 sp_addlinkedsrvlogin,无需指定本地用户名。
创建或更新 SQL Server 本地实例上的登录名与远程服务器中安全帐户之间的映射语法如下:
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
[ , [ @useself = ] 'TRUE' | 'FALSE' | NULL ]
[ , [ @locallogin = ] 'locallogin' ]
[ , [ @rmtuser = ] 'rmtuser' ]
[ , [ @rmtpassword = ] 'rmtpassword' ]
- @rmtsrvname:应用登录映射的链接服务器的名称。
- @useself:确定是否通过模拟本地登录名或显式提交登录名和密码来连接到 rmtsrvname。默认值为 TRUE。
值为 TRUE 指定登录名使用其自己的凭据来连接到rmtsrvname,rmtuser和rmtpassword自变量被忽略。 FALSE指定rmtuser和rmtpassword参数用于连接到rmtsrvname。 如果rmtuser和rmtpassword也是设置为 NULL,任何登录名或密码用于连接到链接服务器。 - @locallogin:指要本地哪个账户登录到远程服务器。如果不为 NULL, locallogin可以是一个SQL Server登录或 Windows NT用户。
- @rmtuser: