通过存储过程(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 ...
随机推荐
- FontLab VI for Mac 键盘快捷键
使用FontLab VI for Mac,您可以创建,打开,修改,绘制,空间,文字,提示和导出桌面,网页,颜色和可变字体.该应用程序是一个全能的字体编辑器,但也支持与其他字体创建工具的数据交换,使其易 ...
- ASP.NET Aries 高级开发教程:行内编辑事件怎么新增数据到后台(番外篇)
前提: 今天又网友又提出了一个问题,说行内编辑保存之前,怎么新增一些数据提交到后台? 对方说看了源码,也没找到怎么处理,这里就写文给解答一下. 解答: 于是我看了一眼源码,只能说你没找到地方: 第12 ...
- CSS 学习手册
目录 CSS 简介 1.CSS 简介 CSS 概述 层叠次序 2.CSS 基础语法 CSS 语法 值的不同写法和单位 记得写引号 多重声明: 空格和大小写 3.CSS 高级语法 选择器的分组 继承及其 ...
- JS Timing
JS Timing 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.我们称之为计时事件. JavaScript 计时事件 通过使用 Ja ...
- swift为什么不是do while?
swift为什么不是do while do while已经深入人心之后,对repeat while的语义逻辑该如何接受呢? do while的语义逻辑是:这个whilte循环先执行一次.逻辑目标针对w ...
- 中小后台系统UI框架--EasyUI
后台开发人员不擅长前端UI界面,而小型软件公司没有专职美工岗位,开发人员只能借助开源UI框架,复用已有组件,完成用户操作界面.EasyUI是基于jQuery的UI插件集合体,可帮助开发者轻松构建网页. ...
- phpMyAdmin开启IP地址登录
根本没有其他文章说的那么麻烦,又是修改配置文件,又是修改首页文件.在根目录下有个libraries文件夹,进去有个config.default.php文件,修改里面的AllowArbitrarySer ...
- (办公)记事本_Linux的In命令
参考菜鸟教程Linux:https://www.runoob.com/linux/linux-comm-ln.html linux的ln命令. Linux ln命令是一个非常重要命令,它的功能是为某一 ...
- 进制转换器V1.0_Beta
一.截图部分 二.代码部分: char2num() 作用:将字符转化成对应的数字 e.g. '9'->9 'A'->10 int char2num(char ch) ...
- 【使用篇二】SpringBoot定时任务Scheduled(14)
在日常项目运行中,我们总会有需求在某一时间段周期性的执行某个动作.比如每天在某个时间段导出报表,或者每隔多久统计一次现在在线的用户量.在springboot中可以有很多方案去帮我们完成定时器的工作,有 ...