2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

SQL Server 游標(biāo)運(yùn)用:批量創(chuàng)建、刪除鏈接服務(wù)器

 順溜的書架 2015-12-02

一、背景


我們的數(shù)據(jù)庫(kù)比較多,它們提供了外網(wǎng)的訪問(wèn),我現(xiàn)在想對(duì)這些數(shù)據(jù)庫(kù)進(jìn)行一些管理,獲取這些數(shù)據(jù)庫(kù)的一些信息,我們可以通過(guò)什么方式實(shí)現(xiàn)呢?


在SQL Server2005版本之后有一個(gè)叫做鏈接服務(wù)器的新功能,基本的操作可以參考:


SQL Server 2005鏈接服務(wù)器,我們就通過(guò)這個(gè)鏈接服務(wù)器來(lái)獲取我們需要的數(shù)據(jù),但是我們的服務(wù)器比較多,這個(gè)批量創(chuàng)建鏈接服務(wù)器和批量刪除鏈接服務(wù)器就呼之欲出了。


 


二、設(shè)計(jì)過(guò)程


設(shè)計(jì)簡(jiǎn)述:創(chuàng)建如下圖的表結(jié)構(gòu),LinkName保存遠(yuǎn)程鏈接的別名,LinkName2是創(chuàng)建鏈接方式2的一個(gè)補(bǔ)充字段,LinkIP代表遠(yuǎn)程服務(wù)器的地址,如果有端口的還需要加上端口。


這里為什么要設(shè)計(jì)成LinkName與LinkName2并存呢?這是因?yàn)槲覀冊(cè)赥-SQL使用遠(yuǎn)程鏈接的時(shí)候是通過(guò)別名的,我在進(jìn)行兩種方式的切換,只要修改調(diào)換下這兩個(gè)字段的名稱,并且去存儲(chǔ)過(guò)程sp_CreateLink注釋方式1的代碼,恢復(fù)方式2的代碼;





(圖1:LinkConfig表,鏈接方式1)





(圖2:LinkConfig表,鏈接方式2)






(圖3:鏈接方式1的屬性)











(圖4:鏈接方式2的屬性)


詳細(xì)代碼:創(chuàng)建表LinkConfig、批量創(chuàng)建鏈接服務(wù)器存儲(chǔ)過(guò)程、批量刪除鏈接服務(wù)器存儲(chǔ)過(guò)程。


 


復(fù)制代碼

--創(chuàng)建表
CREATE TABLE [dbo].[LinkConfig](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [LinkName] [nvarchar](50) NULL,
    [LinkName2] [nvarchar](50) NULL,
    [LinkIP] [nvarchar](50) NULL,
    [LinkSa] [nvarchar](50) NULL,
    [LinkPassword] [nvarchar](50) NULL,
    [State] [int] NULL CONSTRAINT [DF_LinkConfig_State]  DEFAULT ((0)),
 CONSTRAINT [PK_LinkConfig] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

復(fù)制代碼

復(fù)制代碼

--創(chuàng)建遠(yuǎn)程鏈接sp
-- =============================================
-- Author:        <Viajar>
-- Create date: <2012.01.05>
-- Description:    <創(chuàng)建遠(yuǎn)程鏈接>
-- =============================================
CREATE PROCEDURE [dbo].[sp_CreateLink] 

AS
BEGIN

    SET NOCOUNT ON;

    --創(chuàng)建遠(yuǎn)程鏈接
    DECLARE @linkname VARCHAR(100)
    DECLARE @linkip VARCHAR(100)
    DECLARE @linksa VARCHAR(100)
    DECLARE @linkpassword VARCHAR(100)
    DECLARE @isexists VARCHAR(10)
    DECLARE @sql NVARCHAR(4000)
    SET @isexists = 'False'
    DECLARE @itemCur CURSOR
    SET @itemCur = CURSOR FOR 
        SELECT [LinkName],[LinkIP],[LinkSa],[LinkPassword] FROM dbo.LinkConfig WHERE State =1

    OPEN @itemCur
    FETCH NEXT FROM @itemCur INTO @linkname,@linkip,@linksa,@linkpassword
    WHILE @@FETCH_STATUS=0
    BEGIN
        --正在處理
        PRINT @linkname

        --判斷是否存在
        set @sql = 
            N'IF EXISTS (SELECT * FROM sys.servers WHERE name = '''+ @linkname + ''')
            begin set @IsExistsOUT = ''True'' end'
        exec sp_executesql @sql,N'@IsExistsOUT varchar(10) OUTPUT',@IsExistsOUT=@isexists OUTPUT

        --不存在
        IF(@IsExists = 'False')
        BEGIN
            --創(chuàng)建鏈接方式
            SET @sql = '
            EXEC master.dbo.sp_addlinkedserver @server = N'''+@linkname+''', @srvproduct=N''SQL Server'''
            EXEC(@sql)

            --設(shè)置密碼
            SET @sql = '
            EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'''+@linkname+''', @locallogin = NULL , @useself = N''False'', @rmtuser = N'''+@linksa+''', @rmtpassword = N'''+@linkpassword+''''
            EXEC(@sql)

--            --創(chuàng)建鏈接方式
--            SET @sql = '
--            EXEC master.dbo.sp_addlinkedserver @server = N'''+@linkname+''', @srvproduct=N'''+@linkname+''', @provider=N''SQLNCLI'', @datasrc=N'''+@linkip+''''
--            EXEC(@sql)
--
--            --設(shè)置密碼
--            SET @sql = '
--            EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'''+@linkname+''', @locallogin = NULL , @useself = N''False'', @rmtuser = N'''+@linksa+''', @rmtpassword = N'''+@linkpassword+''''
--            EXEC(@sql)
--
--            --設(shè)置屬性
--            SET @sql = '
--            EXEC master.dbo.sp_serveroption @server=N'''+@linkname+''', @optname=N''rpc'', @optvalue=N''true''
--            ;
--            EXEC master.dbo.sp_serveroption @server=N'''+@linkname+''', @optname=N''rpc out'', @optvalue=N''true''
--            '
--            EXEC(@sql)
        END

        SET @isexists = 'False'
        FETCH NEXT FROM @itemCur INTO @linkname,@linkip,@linksa,@linkpassword
    END 

    CLOSE @itemCur
    DEALLOCATE @itemCur

END

復(fù)制代碼

復(fù)制代碼

--刪除遠(yuǎn)程鏈接sp
-- =============================================
-- Author:        <Viajar>
-- Create date: <2012.01.05>
-- Description:    <刪除遠(yuǎn)程鏈接>
-- =============================================
ALTER PROCEDURE [dbo].[sp_DropLink] 

AS
BEGIN

    SET NOCOUNT ON;

    --刪除遠(yuǎn)程鏈接
    DECLARE @linkname VARCHAR(100)
    DECLARE @linkip VARCHAR(100)
    DECLARE @linksa VARCHAR(100)
    DECLARE @linkpassword VARCHAR(100)
    DECLARE @isexists VARCHAR(10)
    DECLARE @sql NVARCHAR(4000)
    SET @isexists = 'False'
    DECLARE @itemCur CURSOR
    SET @itemCur = CURSOR FOR 
        SELECT [LinkName],[LinkIP],[LinkSa],[LinkPassword] FROM dbo.LinkConfig WHERE State =1

    OPEN @itemCur
    FETCH NEXT FROM @itemCur INTO @linkname,@linkip,@linksa,@linkpassword
    WHILE @@FETCH_STATUS=0
    BEGIN
        --正在處理
        PRINT @linkname

        --判斷是否存在
        set @sql = 
            N'IF EXISTS (SELECT * FROM sys.servers WHERE name = '''+ @linkname + ''')
            begin set @IsExistsOUT = ''True'' end'
        exec sp_executesql @sql,N'@IsExistsOUT varchar(10) OUTPUT',@IsExistsOUT=@isexists OUTPUT

        --不存在
        IF(@IsExists = 'True')
        BEGIN
            --刪除鏈接
            SET @sql = '
            IF  EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'''+@linkname+''')
            BEGIN
            EXEC master.dbo.sp_dropserver @server=N'''+@linkname+''', @droplogins=''droplogins''
            END'
            EXEC(@sql)
        END

        SET @isexists = 'False'
        FETCH NEXT FROM @itemCur INTO @linkname,@linkip,@linksa,@linkpassword
    END 

    CLOSE @itemCur
    DEALLOCATE @itemCur

END

復(fù)制代碼

 


三、注意事項(xiàng)


1.      進(jìn)行方式1與方式2的切換,需要如圖1、圖2的表字段名稱進(jìn)行修改,并且去存儲(chǔ)過(guò)程sp_CreateLink注釋方式1的代碼,恢復(fù)方式2的代碼;


2.      在需要修改表記錄之前需要先刪除所有鏈接服務(wù)器(執(zhí)行存儲(chǔ)過(guò)程sp_DropLink),再創(chuàng)建鏈接服務(wù)器;(執(zhí)行存儲(chǔ)過(guò)程sp_CreateLink); 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多