通过存储过程(SP)实现SQL Server链接服务器(LinkServer)的添加

1. 背景

当系统的微服务化做的不是很高的时候,部分功能要通过DB LinkServer 来实现跨 Server 查询,当然,有时候BI抽数据、DBA数据库维护可能也会创建LinkServer。

特别是当 DB迁移的时候,我们需要检查、创建 DB LinkServer。

2.脚本实现

下面是我们创建的一个存储过程,通过这个存储过程来实现简单、快速的添加链接服务器。

USE [DBA_Manager]
GO

/****** Object:  StoredProcedure [dbo].[USP_Create_DBLink]    Script Date: 2019/7/5 13:52:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:        <Author,,Carson>
-- Create date: <Create Date,2018-06-18,>
-- Description:    <Description,实现创建DB LinkServer的脚本化,>
-- =============================================
CREATE PROCEDURE [dbo].[USP_Create_DBLink]
    -- Add the parameters for the stored procedure here
    @ServerIP varchar(20),@SQLUserName varchar(20)=‘‘,@PassW varchar(20)=‘‘,@DelCurLinks varchar(10)=‘N‘, @Result nvarchar(3000)=‘‘ output
AS
BEGIN

SET NOCOUNT ON;

declare @OriginalSQL nvarchar(3000)
declare @sSQL nvarchar(3000)

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

---判断指定的ServerIP是否已存在DBLinkServer,结合@DelCurLinks输入参数判断是否删除重建

if @DelCurLinks=‘Y‘ and exists(select srvname   from master.dbo.sysservers where srvname <> SERVERPROPERTY(‘servername‘) and srvname=@ServerIP)
begin
    set @sSQL=‘ EXEC master.dbo.sp_dropserver @server=N‘‘‘+@ServerIP+‘‘‘, @droplogins=‘‘droplogins‘‘‘
    Print @sSQL
    exec sp_executesql @sSQL
end

if not exists(select srvname   from master.dbo.sysservers where srvname <> SERVERPROPERTY(‘servername‘) and srvname=@ServerIP) or @DelCurLinks=‘Y‘
begin
        --create  script
        set @OriginalSQL=‘/****** Object:  LinkedServer [<ServerIP>] ******/
                EXEC master.dbo.sp_addlinkedserver @server = N‘‘<ServerIP>‘‘, @srvproduct=N‘‘SQL Server‘‘
                 /* For security reasons the linked server remote logins password is changed with ######## */
                EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N‘‘<ServerIP>‘‘,@useself=N‘‘False‘‘,@locallogin=NULL,@rmtuser=N‘‘<UserName>‘‘,@rmtpassword=‘‘<PWD>‘‘
                --GO
                EXEC master.dbo.sp_serveroption @server=N‘‘<ServerIP>‘‘, @optname=N‘‘collation compatible‘‘, @optvalue=N‘‘true‘‘
                --GO
                EXEC master.dbo.sp_serveroption @server=N‘‘<ServerIP>‘‘, @optname=N‘‘data access‘‘, @optvalue=N‘‘true‘‘
                --GO
                EXEC master.dbo.sp_serveroption @server=N‘‘<ServerIP>‘‘, @optname=N‘‘rpc‘‘, @optvalue=N‘‘true‘‘
                --GO
                EXEC master.dbo.sp_serveroption @server=N‘‘<ServerIP>‘‘, @optname=N‘‘rpc out‘‘, @optvalue=N‘‘true‘‘
                --GO
                EXEC master.dbo.sp_serveroption @server=N‘‘<ServerIP>‘‘, @optname=N‘‘use remote collation‘‘, @optvalue=N‘‘true‘‘
                --GO
                EXEC master.dbo.sp_serveroption @server=N‘‘<ServerIP>‘‘, @optname=N‘‘remote proc transaction promotion‘‘, @optvalue=N‘‘true‘‘
                --GO
                ‘

        set  @sSQL=REPLACE( @OriginalSQL, ‘<ServerIP>‘,@ServerIP )
        set  @sSQL=REPLACE( @sSQL, ‘<UserName>‘,@SQLUserName )
        set  @sSQL=REPLACE( @sSQL, ‘<PWD>‘,@PassW )

        begin try
             exec sp_executesql @sSQL
             print @sSQL
             print ‘Create Link Server[‘+ @ServerIP +‘] successfully!‘
        end try

        begin catch
            print ‘Create Link Server [‘+ @ServerIP +‘] fail! ErrMsg: ‘+ERROR_MESSAGE()
        end catch

end 

if @DelCurLinks=‘N‘ and exists(select srvname   from master.dbo.sysservers where srvname <> SERVERPROPERTY(‘servername‘) and srvname=@ServerIP)
begin
    print ‘Create Link Server [‘+ @ServerIP +‘] fail! ErrMsg: Find DBLinkserver of the Same Name ,Please Check it.‘
end

END

GO

3.方法使用

方法 1: 只输入IP、UID、PWD三个参数,@DelCurLinks不显示输入【此时,@DelCurLinks默认为 N,指明当存在相同的LinkServer时,不删除直接退出。】

Exec USP_Create_DBLink ‘172.XXX.XXX.XXX‘,‘UID‘,‘PWD‘

方法 2:输入IP、UID、PWD、DelCurLinks 四个参数,显示指明当存在相同的LinkServer时,不删除直接退出。

Exec USP_Create_DBLink ‘172.XXX.XXX.XXX‘,‘UID‘,‘PWD‘,‘N‘

方法 3:输入IP、UID、PWD、DelCurLinks 四个参数,显示指明当存在相同的LinkServer时,删除重新创建

Exec USP_Create_DBLink ‘172.XXX.XXX.XXX‘,‘UID‘,‘PWD‘,‘Y‘

4. 其它知识

(1) 查询本SQL Server 已创建的所有实例

select srvname as ‘链接服务器‘   from master.dbo.sysservers where srvname <> SERVERPROPERTY(‘servername‘)

(2)删除已建立的链接服务器(LinkServer)

EXEC master.dbo.sp_dropserver @server=N‘172.XXX.XXX.XXX‘, @droplogins=‘droplogins‘

原文地址:https://www.cnblogs.com/xuliuzai/p/11137961.html

时间: 2024-11-05 22:06:56

通过存储过程(SP)实现SQL Server链接服务器(LinkServer)的添加的相关文章

sql server 与oracle数据互导的一种思路--sql server链接服务器

思路:通过在sql server数据库中添加链接服务器,可以远程查询oracle数据库的表环境准备,安装sql server数据库,并安装好oracle驱动,在配置好tnsname文件中配置好oracle连接,本人用的sql server2008 R2,oracle11g测试,提供程序采用的OraOLEDB.Oracle(网上很多文章说这个不能成功,要选择Microsoft OLE DB Privider for oracle,可我选择这个配置成功,估计是不能同时存在两个,如果有两个,sql s

SQL SERVER链接服务器执行带参存储过程

SQL SERVER通过链接服务器,链接到ORACLE数据库,下面我要在SQL SERVER数据库上写一个存储过程,该存储过程需要用通过链接服务去取ORACLE数据库里的数据,该存储过程是含参数的存储过程.在SQL SERVER 数据库里创建一个存储过程来取ORACLE数据库里的一个表里的数据如下: 1,在SQL SERVER数据库上创建存储过程 USE [ProdDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- =======

SQL Server 链接服务器的安全

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 安全设置(Security Settings) 实现效果:用户A能看见能使用,B用户不能看见这个链接服务器: 实现效果:用户A能看见能使用,B用户能看见但是没有权限使用: 总结 参考文献(References) 二.背景(Contexts) 当需要用远程服务器数据库和本地进行数据交互的时候(例如导数据等),我们通常会在本地创建一个远程服务器的数据库链接,关于创建创建链接服务器可以参考:SQL

如何使用SQL Server链接服务器访问DB2 Server

首先,需要安装Microsoft OLE DB Provider for DB2 下载地址:http://download.microsoft.com/download/B/B/2/BB22098A-C071-415F-9269-2EB26CEFB562/DB2OLEDB_CN.exe安装以后,菜单多出一项: 接下来,运行“数据访问工具”详细进行配置. 假设DB2的配置信息如下所示 可访问的数据库地址:jdbc:db2://10.18.50.149:50000/BPMDB用户名:db2admin

sql server 链接服务器语句

--//创建链接服务器[在本地服务器创建] exec sp_addlinkedserver 'HEE','','SQLOLEDB','192.168.98.222' -- exec sp_addlinkedserver '链接服务器名称','','SQLOLEDB','远程地址'(版本不同时在远程地址处加上远程地址sql版本) --//登录链接服务器 EXEC sp_addlinkedsrvlogin 'HEE','false',null,'Euro','0987654321'

SQL使用链接服务器执行远程数据库上的存储过程

原文:SQL使用链接服务器执行远程数据库上的存储过程 --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin'server_tmp','false',null,'用户名','密码' exec sp_serveroption'server_lnk','rpc out','true' --这个允许调用链接服务器上的存储过程 go --调用: exec ser

sql 2008 链接服务器到 sql 2000

sql server 2008 (x64)上做链接服务器,链接sql server 2000(x86)上的数据库,出现如下错误: 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "未指定的错误".链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "在该服务器上找不到完成该操作所需的存储过程.请与系统管理员联系.&qu

问题:sqlserver 跨服务器连接;结果:Sql Server 跨服务器连接

Sql Server 跨服务器连接 用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服务器名'; '用户名'; '密码', 数据库名.dbo.表名) --导入示例 select * into 表 from openrowset('SQLOLEDB' ,'sql服务器名';'用户名';'密码' ,数据库名.dbo.表名) --创建链接服务器 exec

Sql Server 跨服务器连接

from:https://www.cnblogs.com/railgunman/archive/2010/12/25/1916780.html 用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服务器名'; '用户名'; '密码', 数据库名.dbo.表名) --导入示例 select * into 表 from openrowset('SQLOLE