(3.16)链接服务器/实例访问数据库

【1】链接服务器最佳实践


1.链接数据库

exec sp_addlinkedserver 'csj','','SQLOLEDB','pc'  -- 把【数据库地址pc】与连接名称【csj】绑定
exec sp_addlinkedsrvlogin 'csj','false',null,'sa','123456'   -- 把【用户名sa】和【密码123456】与连接名称【csj】绑定
go 
-- 建立完成之后就可以正常使用了 
select * from csj.bds0040263_db.dbo.Sys_User   --连接名称.数据库名称.dbo.表名称 这是一个完整的sql语句

 exec sp_dropserver 'csj','droplogins'    -- 操作完后,删除【csj】连接名称


exec sp_addlinkedserver 'db64','','SQLOLEDB','192.168.245.81,2433'
exec sp_addlinkedsrvlogin 'db64','false',null,'roadadmin','po@#r53e%$k8(+-3'

select * from db64.db_tank.dbo.v_version
exec sp_dropserver 'db64','droplogins'

 

解析:
--创建远程链接服务器
execute sys.sp_addlinkedserver @server='otherServer',    --被访问的服务器别名
        @srvproduct='',
        @provider='SQLOLEDB',
        @datasrc='192.168.1.3,1466\SFKLPOS\MSSQL2008'    --被访问的服务器地址(IP地址,端口号\服务器名称)
--创建本地用户与远程服务器中用户之间的映射
execute sys.sp_addlinkedsrvlogin @rmtsrvname='otherServer',    --被访问的服务器别名
        @useself='false',    --是否通过模拟本地登录名或显式提交登录名和密码来连接到远程服务器
        @locallogin=null,    --本地登录
        @rmtuser='sa',    --被链接服务器的用户名
        @rmtpassword='sa123456'    --被链接服务器的密码密码
go
    
--建立完成之后就可以正常使用了 
select * from otherServer.NewPosData.dbo.Site_ProductMap    --连接服务器别名.数据库名称.dbo.表名称
go

--删除运行本地与远程之间的用户映射
execute sys.sp_droplinkedsrvlogin @rmtsrvname='otherServer',@locallogin=null
--删除链接服务器
execute sys.sp_dropserver @server='otherServer',@droplogins='droplogins'
go

 

 

 

【2】OPENROWSET函数 与 openquery

【2.1】OPENROWSET

需要先在主服务器上更改一个设置,右击主服务器——方面

需要把AdHocRemoteQueriesEnabled属性改为True,默认是false的

--------***此外也可以通过语句来完成上面的操作

use master;  
GO  
exec sp_configure 'show advanced option','1';  
reconfigure  
exec sp_configure 'Ad Hoc Distributed Queries','1';  
reconfigure  

如果想关闭远程则可以把‘1’改成‘0’   *****------------

然后就可以通过语句直接访问目标服务器中的数据库了
测试一下:

select * from  
openrowset('SQLNCLI', 'Server=127.0.0.1,8888;UID=用户名;PWD=密码;','select * from 表名')  

 

另外OPENROWSET 是一次性的访问,对于经常性要链接的服务器可以直接添加链接服务器

【2.2】openquery

建立好连接服务器之后,异构操作需要用openquery
--测试
insert OPENQUERY(MySQL,'SELECT * FROM test.Demo') (ID,Name) values(1,'Roy')

--查询
SELECT * 
  FROM OPENQUERY(MySQL,'SELECT * FROM test.Demo') AS A

 

-----------------

【3】SSMS操作

首先推荐使用的是数据不落地的“链接服务器”。使用SQL2012的SSMS,同时连接到SQL2012和SQL2008的实例,通过编写脚本把SQL2012的数据导入到SQL2008中。两个实例的可以通过链接服务器来连接。以下是设置步骤。

figure-2:新建链接服务器

 

这里Product name:要输入指定的,否则可能会报错。 比如输入 MSSQLSERVER,或者MSSQL也行(其实任意产品名称都行,我输入mysql都行,aaa也行)

figure-3:链接服务器和数据源

 

figure-4:认证

 

figure-5:创建成功后,可以直接浏览链接服务器的目录,也可以使用语句查询了。

 

 

使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据

【4】使用SP来添加链接服务器

一、sp_addlinkedserver 

创建链接服务器。 链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。 在使用 sp_addlinkedserver 创建链接服务器后,可对该服务器运行分布式查询。 如果链接服务器定义为 SQL Server 实例,则可执行远程存储过程。

1、语法:

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

2、参数:

@server= ] 'server'

要创建的链接服务器的名称。 server 的数据类型为 sysname,无默认值。

@srvproduct= ] 'product_name'

要添加为链接服务器的 OLE DB 数据源的产品名称。 product_name 的数据类型为 nvarchar(128),默认值为 NULL。 如果为 SQL Server,则不必指定provider_name、data_source、location、provider_string 和 catalog。

@provider= ] 'provider_name'

与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。 对于当前计算机中安装的指定 OLE DB 访问接口,provider_name 必须唯一。 provider_name 的数据类型为nvarchar(128),默认值为 NULL;但如果忽略 provider_name,则使用 SQLNCLI。 (使用 SQLNCLI 并且 SQL Server 将重定向到 SQL Server Native Client OLE DB 访问接口的最新版本。)OLE DB 访问接口应以指定的 PROGID 在注册表中注册。

@datasrc= ] 'data_source'

由 OLE DB 访问接口解释的数据源的名称。 data_source 的数据类型为 nvarchar(4000)。 data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 访问接口。

@location= ] 'location'

由 OLE DB 访问接口解释的数据库的位置。 location 的数据类型为 nvarchar(4000),默认值为 NULL。 location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 访问接口。

@provstr= ] 'provider_string'

OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。 provider_string 的数据类型为 nvarchar(4000),默认值为 NULL。 provstr 或传递给 IDataInitialize 或设置为 DBPROP_INIT_PROVIDERSTRING 属性,以初始化 OLE DB 访问接口。

当针对 SQL Server Native Client OLE DB 访问接口创建链接服务器时,可以使用 SERVER 关键字来指定实例,即使用 SERVER=servername\instancename 指定特定 SQL Server 实例。 servername 是运行 SQL Server 的计算机的名称,instancename 是用户要连接的特定 SQL Server 实例的名称。

 注意

若要访问镜像数据库,则连接字符串必须包含数据库名称。 该名称是数据访问接口启用故障转移尝试所必需的。 可以在 @provstr 或 @catalog 参数中指定数据库。 此外,连接字符串还可以提供故障转移伙伴名称。

@catalog= ] 'catalog'

与 OLE DB 访问接口建立连接时所使用的目录。 catalog 的数据类型为 sysname,默认值为 NULL。 catalog 作为 DBPROP_INIT_CATALOG 属性传递以初始化 OLE DB 访问接口。 在针对 SQL Server 实例定义链接服务器时,目录指向链接服务器映射到的默认数据库。

3、返回代码值:0(成功)或 1(失败)

详细参考:http://technet.microsoft.com/zh-cn/library/ms190479.aspx

二、sp_addlinkedsrvlogin

创建或更新 SQL Server 本地实例上的登录名与远程服务器中安全帐户之间的映射。

1、语法:

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

2、参数:

@rmtsrvname = 'rmtsrvname'

  应用登录映射的链接服务器的名称。 rmtsrvname 的数据类型为 sysname,无默认值。

@useself = 'TRUE| 'FALSE' | 'NULL'

  确定是否通过模拟本地登录名或显式提交登录名和密码来连接到 rmtsrvname。 数据类型为 varchar(8),默认值为 TRUE。

  值为 TRUE 指定登录名使用自己的凭据连接到 rmtsrvname,而忽略 rmtuser 和 rmtpassword 参数。 FALSE 指定 rmtuser 和 rmtpassword 参数用于连接到指定 locallogin 的    rmtsrvname。 如果 rmtuser 和 rmtpassword 也设置为 NULL,则不使用登录名或密码来连接链接服务器。

@locallogin = 'locallogin'

  本地服务器上的登录。 locallogin 的数据类型为 sysname,默认值为 NULL。 NULL 指定此项应用于连接到 rmtsrvname 的所有本地登录。 如果不为 NULL,则 locallogin 可以是 SQL   Server 登录或 Windows 登录。 对于 Windows 登录来说,必须以直接的方式或通过已被授权访问的 Windows 组成员身份授予其访问 SQL Server 的权限。

@rmtuser = 'rmtuser'

  当 @useself 为 FALSE 时,用于连接到 rmtsrvname 的远程登录名。 当远程服务器是不使用 Windows 身份验证的 SQL Server 实例时,rmtuser 是一个 SQL Server 登录名。    rmtuser 的数据类型为 sysname,默认值为 NULL。

@rmtpassword = 'rmtpassword'

  与 rmtuser 关联的密码。 rmtpassword 的数据类型为 sysname,默认值为 NULL。

3、返回代码值:0(成功)或 1(失败)

详细参考:http://technet.microsoft.com/zh-cn/library/ms189811.aspx

三、sp_droplinkedsrvlogin

删除运行 SQL Server 的本地服务器上的登录与链接服务器上的登录之间的现有映射。 

1、语法:

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

2、参数:

@rmtsrvname = 'rmtsrvname'

应用 SQL Server 登录映射的链接服务器名称。rmtsrvname 的数据类型为 sysname,无默认值。 rmtsrvname 必须已存在。

@locallogin = 'locallogin'

本地服务器上的 SQL Server 登录,它具有到链接服务器 rmtsrvname 的映射。locallogin 的数据类型为 sysname,无默认值。 locallogin 到 rmtsrvname 的映射必须已经存在。 如果为 NULL,则删除 sp_addlinkedserver 创建的默认映射(该映射将本地服务器上的所有登录映射到链接服务器上的登录)。

3、返回代码值:0(成功)或 1(失败)

详细参考:http://technet.microsoft.com/zh-cn/library/ms186218.aspx

四、sp_dropserver

从本地 SQL Server 实例中的已知远程服务器和链接服务器的列表中删除服务器。

1、语法:

sp_dropserver [ @server = ] 'server' 
     [ , [ @droplogins = ] { 'droplogins' | NULL} ]

2、参数:

@server = 'server'

要删除的服务器。 server 的数据类型为 sysname,无默认值。 server 必须存在。

@droplogins = 'droplogins' | NULL

指示如果指定了 droplogins,那么对于 server,还必须删除相关的远程服务器和链接服务器登录名。 @droplogins 的数据类型为 char(10),默认值为 NULL。

3、返回代码值:0(成功)或 1(失败)

详细参考:http://technet.microsoft.com/zh-cn/library/ms174310.aspx

示例:

复制代码
--创建远程链接服务器
execute sys.sp_addlinkedserver @server='otherServer',    --被访问的服务器别名
        @srvproduct='',
        @provider='SQLOLEDB',
        @datasrc='192.168.1.3,1466\SFKLPOS\MSSQL2008'    --被访问的服务器地址(IP地址,端口号\服务器名称)
--创建本地用户与远程服务器中用户之间的映射
execute sys.sp_addlinkedsrvlogin @rmtsrvname='otherServer',    --被访问的服务器别名
        @useself='false',    --是否通过模拟本地登录名或显式提交登录名和密码来连接到远程服务器
        @locallogin=null,    --本地登录
        @rmtuser='sa',    --用户名
        @rmtpassword='sa123456'    --密码
go
    
--建立完成之后就可以正常使用了 
select * from otherServer.NewPosData.dbo.Site_ProductMap    --连接服务器别名.数据库名称.dbo.表名称
go

--删除运行本地与远程之间的用户映射
execute sys.sp_droplinkedsrvlogin @rmtsrvname='otherServer',@locallogin=null
--删除链接服务器
execute sys.sp_dropserver @server='otherServer',@droplogins='droplogins'
go
posted @ 2018-06-25 11:26  郭大侠1  阅读(606)  评论(0编辑  收藏  举报