链接服务器(Linked Server)允许访问针对OLE DB数据源的分布式异构查询, 通过使用sys.sp_addlinkedserver创建链接服务器后,可以对此服务器运行分布式查询。 如果链接服务器被定义为SQL Server实例,则可以执行远程存储过程。

一,链接服务器

使用 sys.sp_addlinkedserver 添加链接服务器,除了必须在本地自定义一个链接服务器的别名(Alias)之外,还必须指定链接服务器的产品名称(Product Name)、提供程序名称(Provider Name)、数据源(Data Source)、提供程序字符串( Provider String)等参数,添加成功之后,系统自动创建一个默认登陆映射,用于访问链接服务器。

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]

参数解释:

  • @server= 'server' :用于指定Linked Server的别名,没有默认值;
  • @srvproduct='product_name' :用于指定OLE DB 数据源的产品名称,默认值是NULL;
  • @provider= 'provider_name' :OLE DB提供程序的唯一编程标识符(PROGID),provider_name对于当前计算机上安装的指定OLE DB提供程序必须是唯一的。如果省略provider_name,则使用SQLNCLI。
  • @datasrc= 'data_source':由OLE DB提供程序解释的数据源名称
  • @provstr='provider_string':指定OLE DB提供程序的连接字符串,用于唯一标识一个数据源。当针对SQL Server Native Client OLE DB提供程序创建链接服务器时,可以使用SERVER关键字指定实例作为SERVER = servername \ instancename来指定特定的SQL Server实例。 servername是运行SQL Server的计算机的名称,instancename是用户将连接到的SQL Server的特定实例的名称。

1,OLEDB 提供程序

用户需要手动安装OLE DB提供程序,系统中已经安装的OLE DB提供程序可以从Linked Servers 目录下查看。

例如,添加SQL Server作为Linked Server,把参数@srvproduct 设置为 N'' :

exec sys.sp_addlinkedserver @server= N'ServerAlias'
,@srvproduct= N''
,@provider= N'SQLNCLI'
,@datasrc= N'Host\SQLServerInstanceName'

例如,添加Microsoft Access作为Linked Server,把参数 @srvproduct 设置为 N'OLE DB Provider for Jet':

EXEC sp_addlinkedserver
@server = N'SEATTLE Mktg',
@provider = N'Microsoft.Jet.OLEDB.4.0',
@srvproduct = N'OLE DB Provider for Jet',
@datasrc = N'C:\MSOffice\Access\Samples\Northwind.mdb';

例如,添加Excel作为Linked Server,把参数@srvproduct设置为'Jet 4.0',参数@provstr设置为'Excel 5.0':

EXEC sp_addlinkedserver
@server='ExcelSource',
@srvproduct='Jet 4.0',
@provider='Microsoft.Jet.OLEDB.4.0',
@datasrc='c:\MyData\DistExcl.xls',
@provstr='Excel 5.0';

2,查看添加的链接服务器

使用sys.servers查看添加到本地服务器的Linked Server,其中,server_id 是 0,代表本地服务器。

select *
from sys.servers
where name=N'ExcelDataSource'

二,链接服务器的登陆(Login)

当用户创建了一个链接服务器,SQL Server创建一个默认的登陆,映射到public服务器角色,这意味着,所有的登陆都可以查看该链接服务器。为了限制用户查看这些链接服务器,管理员需要移除默认的登陆映射。

1,创建链接服务器的登陆

当用户登陆到本地服务器执行访问链接服务器上的数据的分布式查询时,本地服务器必须代表该用户登陆到链接服务器,才能访问连接服务器上的数据,管理员通过使用sys.sp_addlinkedsrvlogin 指定本地服务器登陆到链接服务器的登陆账户。如果链接服务器是SQL Server,那么必须使用SQL Server验证模式登陆,不能使用Windows 验证的域账户登陆。

存储过程sys.sp_addlinkedsrvlogin用于创建或更新SQL Server本地实例上的登录和远程服务器上的安全帐户之间的映射。

sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
[ , [ @useself = ] 'TRUE' | 'FALSE' | NULL ]
[ , [ @locallogin = ] 'locallogin' ]
[ , [ @rmtuser = ] 'rmtuser' ]
[ , [ @rmtpassword = ] 'rmtpassword' ]

参数解释:

  • @rmtsrvname =  'rmtsrvname' :用于指定链接服务器的别名;
  • @useself =  'TRUE' | 'FALSE' | 'NULL' :通过模拟本地登录或显式提交登录名和密码来确定是否连接到rmtsrvname,默认值是TRUE。默认情况下,Login使用自己的凭证链接rmtsrvname;如果设置为FALSE,意味着,使用参数 rmtuser和rmtpassword作为验证的用户名和密码去连接rmtsrvname;
  • @locallogin = 'locallogin' :本地服务器的Login,默认值是NULL。默认情况下,使用本地Login连接rmtsrvname,如果该参数不是NULL,那么使用该参数指定的Login登陆rmtsrvname;
  • @rmtuser =  'rmtuser' ,@rmtpassword =  'rmtpassword' :当参数@useself为FALSE时,使用@rmtuser和@rmtpassword去连接rmtsrvname。注意,rmtuser 是SQL Server登陆。

注意,执行存储过程sp_addlinkedserver会自动创建本地服务器上所有登录和链接服务器上远程登录之间的默认映射。默认映射指出,当代表登录名连接到链接服务器时,SQL Server使用本地登录名的用户凭据。 这相当于对链接服务器执行

exec sys.sp_addlinkedsrvlogin @rmtsrvname='remote server', @useself='TRUE'

使用sp_addlinkedsrvlogin只能更改默认映射或为特定的本地登录添加新映射。 要删除默认映射或任何其他映射,请使用sp_droplinkedsrvlogin。

2,添加链接服务器Login的示例

2.1  使用User自己的凭证去登陆Linked Server

这种方式要求显式将每个User Login mapping到Linked Server,使其有权限登录。

EXEC sp_addlinkedsrvlogin 'Accounts', 'true';

2.2 特定的用户使用特定的账户登陆链接服务器

把Windows域账户“Domain\Mary” 映射到 SQL Server验证的账户"MaryP",使其有权限登陆到Linked Server。

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', 'd89q3w4u';

2.3,所有的用户都使用相同的账户登陆链接服务器

设置参数@locallogin 为null,使所有本地Login都能使用 “MaryP” 来登陆Linked Server。

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', null, 'MaryP', 'd89q3w4u';

3,查看链接服务器的Login

系统视图sys.linked_logins ,为每一个链接服务器Login映射返回一行数据:

  • server_id:0是指本地服务器,大于0的整数值是指链接服务器的ID。
  • local_principal_id:如果local_principal_id 不为0,其值是参数@locallogin对应的服务器级别的Principal,使用 sys.server_principals 查看该ID对应的主体;如果local_principal_id=0,表示@locallogin是NULL。
  • uses_self_credential:1是指使用自己的凭证访问链接服务器;0是指使用相同的用户和密码访问链接服务器。
  • remote_name:远程用户名,是指当登陆到链接服务器时 ,使用 remote_name 来登陆Linked Server,即登陆Linked Server的 Login。

4,删除链接服务器的Login

删除本地服务器和链接服务器上的登陆之间的映射,映射一旦删除,本地服务器上的Login就不能登陆到链接服务器。

sp_droplinkedsrvlogin [ @rmtsrvname= ] 'rmtsrvname' ,
[ @locallogin= ] 'locallogin'

参数解释:

@rmtsrvname =  'rmtsrvname':指定链接服务器的别名

@locallogin =  'locallogin' :指定本地的Login,

4.1 删除本地登陆 Mary访问链接服务器的映射:

EXEC sp_droplinkedsrvlogin 'remote server', 'Mary'

4.2 删除本地服务器访问链接服务器的默认登陆映射

EXEC sp_droplinkedsrvlogin 'remote server', null

参考文档:

sp_addlinkedserver (Transact-SQL)

sp_addlinkedsrvlogin (Transact-SQL)

Distributed1:链接服务器的更多相关文章

  1. SQL链接服务器

    最近做项目,需要对两个数据库进行同步操作,所以采用在Server SQL中建立链接服务器方式实现. 链接服务器,可以直接访问/操作其他服务器上的数据库表. 1.连接SQL Server链接服务器 EX ...

  2. SQL Server 链接服务器的安全

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 安全设置(Security Settings) 实现效果:用户A能看见能使用,B用户不能看见这 ...

  3. sqlserver 多库查询 sp_addlinkedserver使用方法(添加链接服务器)

    sqlserver 多库查询 sp_addlinkedserver使用方法(添加链接服务器) 我们日常使用SQL Server数据库时,经常遇到需要在实例Instance01中跨实例访问Instanc ...

  4. Sqlserver通过链接服务器访问Oracle的那些事儿

    前言: 1.不经历风雨,怎能见彩虹. 2.充分利用BaiDu.google等搜索引擎查找资料并整合分析! 3.世上无难事只怕有心人! 本文由来:笔者在研究SQLSERVER链接服务器到oracle并使 ...

  5. SQL SERVER使用ODBC 驱动建立的链接服务器调用存储过程时参数不能为NULL值

    我们知道SQL SERVER建立链接服务器(Linked Server)可以选择的驱动程序非常多,最近发现使用ODBC 的 Microsoft OLE DB 驱动程序建立的链接服务器(Linked S ...

  6. SQL SERVER 2000通过链接服务器发送邮件出现错误

    案例环境: 服务器A系统: Windows Server 2000 数据库版本 : Microsoft SQL Server  2000 - 8.00.2282 (Intel X86) 服务器B系统: ...

  7. [翻译]——SQL Server使用链接服务器的5个性能杀手

    前言: 本文是对博客http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-server ...

  8. 没有活动事务 链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务

    在windows2003下执行分布式事务的时候出现如下情况. 一. 问题现象在执行分布式事务时,在sql server 2005下收到如下错误: 链接服务器"xxxxxxx"的 O ...

  9. 使用sql server 链接服务器

    在我们的日常应用场景中经常会碰访问不同服务器上的数据库,即跨服务器访问操作不同的服务器上的SQL Sever数据库, 这个时候Sql Server的链接服务器就非常实用,创建SQL语句如下: --重新 ...

随机推荐

  1. 可以简易设置文字内边距的EdgeInsetsLabel

    可以简易设置文字内边距的EdgeInsetsLabel 最终效果: 源码: EdgeInsetsLabel.h 与 EdgeInsetsLabel.m // // EdgeInsetsLabel.h ...

  2. iptables简单规则记录

    先来一句:好记性不如烂笔头! 1.iptables简介 iptables是基于包过滤的防火墙,它主要工作在osi模型的2,,4层,也可以工作在7层(iptables + squid) 2.原理 防火墙 ...

  3. for 与forEach的区别

    for循环 for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素.在处理比较复杂的处理的时候较为方便. foreach循环 foreach,从头到尾,对于集合中的对象遍历 ...

  4. [EffectiveC++]item32:确定你的public继承模塑出is-a关系

  5. gamit安装

    需要准备的文件: 默认已安装好虚拟机和Ubuntu系统 1.输入用户名密码,进入Ubuntu10.04桌面.按下“Ctrl+Alt+T”,进入终端: 2.在终端输入“sudo gedit /etc/a ...

  6. 丢手绢问题(约瑟夫问题)的python实现

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...

  7. 20165318 2017-2018-2 《Java程序设计》第四周学习总结

    20165318 2017-2018-2 <Java程序设计>第四周学习总结 IDEA安装 按照娄老师Intellj IDEA 简易教程,我下载了IDEA但是由于没有注册学校邮箱,我没办法 ...

  8. Java并发编程--1.Thread和Runnable

    创建线程 Java有两种方式创建线程, 继承Thread类和实现Runnable接口 继承Thread 步骤: 1.自定义一个类继承Thread类, 重写run方法 2.创建自定义类的对象,调用sta ...

  9. linq to sql 中增删改查

    首先我先说一下,如果真的要用linq做项目的话,也会是比较方便的.已经尝试了在三层架构中应用linq to sql 比较方便. //有三个不同的数据库表,所以写法不一样 public class Li ...

  10. Sequelize-nodejs-8-Transactions

    Transactions事务 Sequelize supports two ways of using transactions: Sequelize支持两种使用transactions的方法 One ...