链接服务器(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. Office 365实现单点登录系列(5)—配置单点登录

    这是单点登录系列的最后一篇文章,前面4篇文章其实都是在为这篇文章的内容做准备,我把这四篇文章的链接放在下面,如果大家有需要,可以参考我以下的链接: Office 365实现单点登录系列(1)—域环境搭 ...

  2. CSS学习摘要-定位实例

    CSS学习摘要-定位实例 注:全文摘自MDN-CSS定位实例 列表消息盒子 我们研究的第一个例子是一个经典的选项卡消息框,你想用一块小区域包括大量信息时,一个非常常用的特征.这包括含有大信息量的应用, ...

  3. SQL Sever——妙用种子列

    /****** Script for SelectTopNRows command from SSMS ******/ SELECT TOP 1000 [OFFRCD_STATUS_ID] ,[OFF ...

  4. 用一个变量表示 ----------"序号,名称,价格"

     goods = [{"name": "电脑", "price": 1999},          {"name": & ...

  5. strip() 只去头尾的,不能去中间

    # b = st.strip("|") # strip() 只去头尾的,不能去中间

  6. 寒假短期学习计划 - C++

    寒假短期学习计划 - C++ 一.所选课程 && 相关 0.选以下课的理由: 选课理由0: 只是短期的计划,先选些短视频感受:之后再视情况选其他课: 选课理由1: 难度低,以前自学过一 ...

  7. 鼠标有但是U盘读取不出来怎么办

    我今天就遇到了这个问题,搞了半天最后下了一个驱动人生,查看里面的回答才解决 就是把里面通用串行总控制器设置为隐藏文件可读之后选择把灰色的都删除就好了.具体可以在驱动人生里搜U盘不识别,之后就4,5步即 ...

  8. c++中堆、栈内存分配

    转自:https://blog.csdn.net/qingtingchen1987/article/details/7698415 一个由C/C++编译程序占用内存分为以下几个部分1.栈区(stack ...

  9. Php发送post请求方法

    因为自己时常用到 所以还是发布一下吧 /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data post键值对数据 * @r ...

  10. 利用NET HUNTER建立一个自动文件下载的网络接入点

    免责声明:本文旨在分享技术进行安全学习,禁止非法利用. 本文中我将完整的阐述如何通过建立一个非常邪恶的网络接入点来使得用户进行自动文件下载.整个过程中我将使用 Nexus 9 来运行Kali NetH ...