說說數據庫批量更新維護
情況:多臺數據庫服務器,每臺服務器多個數據庫,數據庫結構一致(提供給不同客戶使用)
一、手工操作
1、數據庫少
下拉列表選擇不同數據庫,執(zhí)行更新腳本sql.數據庫少,操作感覺不到麻煩。
2、數據庫多
下拉列表選擇不同數據庫,操作麻煩,容易遺漏更新數據庫。
SQL Server Management Studio這個下拉列表,還不支持拉大縮小,數據庫多了去選擇不同數據庫相當夠嗆。
二、半自動
思路:先更新一個數據庫(NEWNEW),比如更新了存儲過程AddSaleOrder和DeleteSaleOrder, 和執(zhí)行一段sql(DELETE FROM dbo.SystemConfig WHERE ConfigName='A'),然后通過sql參照這個數據庫更新同臺服務器的其他數據庫。
- USE [NEWNEW]
- DECLARE @name SYSNAME
- DECLARE userDB CURSOR FOR select name from master.dbo.sysdatabases WHERE SID <> 0x01
- OPEN userDB
- FETCH NEXT FROM userDB INTO @name
- WHILE (@@FETCH_STATUS = 0)
- BEGIN
- EXEC('use [' + @name + '] IF (EXISTS(SELECT 1 FROM dbo.sysobjects o WHERE o.NAME = ''Customer'' AND o.xtype = ''U'')) BEGIN PRINT ''' + @name + ''' END')
- FETCH NEXT FROM userDB INTO @name
- END
- CLOSE userDB
- DEALLOCATE userDB
假如輸出:
- DB1
- DB2
- DB3
獲取一臺服務器上的所有自定義數據庫,select name from master.dbo.sysdatabases WHERE SID <> 0x01
通過游標再次再次過濾需要的自定義數據庫(一個特殊的對象,比如:Customer表)
生成批量更新數據庫的腳本:
- USE [NEWNEW]
- DECLARE @objectID INT
- DECLARE @objectName SYSNAME
- DECLARE @ObjectType CHAR(2)
- DECLARE @text VARCHAR(MAX)
- DECLARE @dbName SYSNAME
- DECLARE getName CURSOR SCROLL FOR select name from master.dbo.sysdatabases WHERE SID <> 0x01 AND NAME IN ('DB1' ,'DB2' ,'DB3')
- OPEN getName
- DECLARE getObj CURSOR FOR SELECT o.id, o.[name], o.xtype FROM dbo.sysobjects o WHERE o.NAME IN ('AddSaleOrder' ,'DeleteSaleOrder') AND o.xtype IN ('P', 'FN', 'V')
- OPEN getObj
- FETCH NEXT FROM getObj INTO @objectID, @objectName, @ObjectType
- WHILE (@@FETCH_STATUS = 0)
- BEGIN
- SET @text = ''
- SELECT @text = @text + s.[text] FROM dbo.syscomments s WHERE s.id = @objectID
- FETCH FIRST FROM getName INTO @dbName
- WHILE (@@FETCH_STATUS = 0)
- BEGIN
- IF (@dbName = 'DB1')
- USE [DB1]
- ELSE IF (@dbName = 'DB2')
- USE [DB2]
- ELSE IF (@dbName = 'DB3')
- USE [DB3]
- IF (EXISTS(SELECT 1 FROM dbo.sysobjects o WHERE o.NAME = @objectName AND o.xtype = @ObjectType))
- BEGIN
- IF (@ObjectType = 'P')
- EXEC ('DROP PROCEDURE dbo.' + @objectName)
- ELSE IF(@ObjectType = 'V')
- EXEC ('DROP VIEW dbo.' + @objectName)
- ELSE IF(@ObjectType = 'FN')
- EXEC ('DROP FUNCTION dbo.' + @objectName)
- END
- EXEC (@text)
- EXEC ('DELETE FROM dbo.SystemConfig WHERE ConfigName=''A''')
- USE [NEWNEW]
- FETCH NEXT FROM getName INTO @dbName
- END
- FETCH NEXT FROM getObj INTO @objectID, @objectName, @ObjectType
- END
- CLOSE getObj
- DEALLOCATE getObj
- CLOSE getName
- DEALLOCATE getName
dbo.syscomments存儲的存儲過程腳本,如果腳本字符超過4000字符,會多行存儲。@text = @text + s.[text]累加得到腳本,沒個對象更新時SET @text = '',清除
輔助winform:
源代碼下載:http://files.cnblogs.com/yinyunpan/WangshijieTool.rar
3、自動
向大家請教了。。。
原文鏈接:http://www.cnblogs.com/yinyunpan/archive/2011/05/26/2057945.html
【編輯推薦】