通過存儲過程(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'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM