乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      SQL Server 游標運用:批量創(chuàng)建、刪除鏈接服務器

       順溜的書架 2015-12-02

      一、背景


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


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


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


       


      二、設計過程


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


      這里為什么要設計成LinkName與LinkName2并存呢?這是因為我們在T-SQL使用遠程鏈接的時候是通過別名的,我在進行兩種方式的切換,只要修改調(diào)換下這兩個字段的名稱,并且去存儲過程sp_CreateLink注釋方式1的代碼,恢復方式2的代碼;





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





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






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











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


      詳細代碼:創(chuàng)建表LinkConfig、批量創(chuàng)建鏈接服務器存儲過程、批量刪除鏈接服務器存儲過程。


       


      復制代碼

      --創(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]

      復制代碼

      復制代碼

      --創(chuàng)建遠程鏈接sp
      -- =============================================
      -- Author:        <Viajar>
      -- Create date: <2012.01.05>
      -- Description:    <創(chuàng)建遠程鏈接>
      -- =============================================
      CREATE PROCEDURE [dbo].[sp_CreateLink] 
      
      AS
      BEGIN
      
          SET NOCOUNT ON;
      
          --創(chuàng)建遠程鏈接
          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)
      
                  --設置密碼
                  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)
      --
      --            --設置密碼
      --            SET @sql = '
      --            EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'''+@linkname+''', @locallogin = NULL , @useself = N''False'', @rmtuser = N'''+@linksa+''', @rmtpassword = N'''+@linkpassword+''''
      --            EXEC(@sql)
      --
      --            --設置屬性
      --            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

      復制代碼

      復制代碼

      --刪除遠程鏈接sp
      -- =============================================
      -- Author:        <Viajar>
      -- Create date: <2012.01.05>
      -- Description:    <刪除遠程鏈接>
      -- =============================================
      ALTER PROCEDURE [dbo].[sp_DropLink] 
      
      AS
      BEGIN
      
          SET NOCOUNT ON;
      
          --刪除遠程鏈接
          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

      復制代碼

       


      三、注意事項


      1.      進行方式1與方式2的切換,需要如圖1、圖2的表字段名稱進行修改,并且去存儲過程sp_CreateLink注釋方式1的代碼,恢復方式2的代碼;


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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多