通过存储过程(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'
通过存储过程(SP)实现SQL Server链接服务器(LinkServer)的添加的更多相关文章
- sql server 与oracle数据互导的一种思路--sql server链接服务器
思路:通过在sql server数据库中添加链接服务器,可以远程查询oracle数据库的表环境准备,安装sql server数据库,并安装好oracle驱动,在配置好tnsname文件中配置好orac ...
- SQL Server 链接服务器的安全
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 安全设置(Security Settings) 实现效果:用户A能看见能使用,B用户不能看见这 ...
- 使用sql server 链接服务器
在我们的日常应用场景中经常会碰访问不同服务器上的数据库,即跨服务器访问操作不同的服务器上的SQL Sever数据库, 这个时候Sql Server的链接服务器就非常实用,创建SQL语句如下: --重新 ...
- 如何使用SQL Server链接服务器访问DB2 Server
首先,需要安装Microsoft OLE DB Provider for DB2 下载地址:http://download.microsoft.com/download/B/B/2/BB22098A- ...
- SQL Server 链接服务器连接 SQLite数据库文件
SQL Server数据库允许通过数据库驱动程序连接各类数据库并进行操作.以下是在SQL Server 2012 R2中建立SQLite的链接服务器. 一.下载SQLite数据库的ODBC驱动程序: ...
- SQL Server链接服务器信息查询
exec sp_helpserver --查询链接服务器select * from sys.servers --查询链接服务器链接地址
- 【SQL】链接服务器
最近做项目,需要对两个数据库进行同步操作,所以采用在Server SQL中建立链接服务器方式实现. 链接服务器,可以直接访问/操作其他服务器上的数据库表. 1.连接SQL Server链接服务器 EX ...
- SQL使用链接服务器执行远程数据库上的存储过程
原文:SQL使用链接服务器执行远程数据库上的存储过程 --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' ...
- SQL Server跨服务器查询的实现方法,OpenDataSource
SQL Server跨服务器查询的方法我们经常需要用到,下面就为您介绍两种SQL Server跨服务器查询的方法,如果您感兴趣的话,不妨一看. SQL Server跨服务器查询方法一:用OPENDAT ...
随机推荐
- TCPUDPDbg(TCP UDP 网络调试工具)
下载链接:https://pan.baidu.com/s/1oan44qop73X5VuBcE-rjeA 提取码:v0oa
- js实现常见排序算法
电脑配置 CPU:AMD X4 640 内存: 宏想 DDR3 1600MHz 8g 主板:华擎 980DE3/U3S3 R2.0 浏览器:chrome 79.0.3945.88(正式版本) (64 ...
- weui实现滚动加载的效果
weui是微信公司提供的一个UI框架,在H5开发中一些组件可以直接使用.weui文档地址:http://www.jqweui.cn/components 使用weui,需要引入weui.css和jqu ...
- vue-preview vue图片预览插件+缩略图样式
一.安装 npm i vue-preview -S 二.main.js中 导入组件 //vue-preview 开始 import VuePreview from 'vue-preview'; // ...
- mysql登录错误:'Access denied for user 'root'@'localhost'
首先是不知道怎么忽然mysql用命令行,workbench都登录不了,都提示'Access denied for user 'root'@'localhost'. 数据库卸载重装了几次都不行.好像感觉 ...
- USB OTG ID 检测原理【转】
OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时 ...
- centos查询目标文件文件所在位置
之前有试过whereis这种语法但是查询文件不大理想.然后找到了下边这种方式可以很好的查询目标文件的位置 #在根目录 /下查找所有叫nginx的文件 find / -name nginx
- 第十六届浙江大学宁波理工学院程序设计大赛 D 雷顿女士与分队hard version(dp)
题意 链接:https://ac.nowcoder.com/acm/contest/2995/D来源:牛客网 卡特莉接到来自某程序设计竞赛集训队的邀请,来为他们进行分队规划. 现在集训队共有n名选手, ...
- August 25th, 2019. Sunday, Week 35th.
It's what you do next that counts, not what happens but what you decide to do about it. 重点不是发生了什么,而是 ...
- vue定义全局date过滤器(自定义JS文件模块和Moment.js库)
自定义dateFormat.js文件模块 dateFormat.js /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-0 ...