首页 运维 正文
说说数据库批量更新维护

 2022-10-23    289  

情况:多台数据库服务器,每台服务器多个数据库,数据库结构一致(提供给不同客户使用)

一、手工操作

1、数据库少

下拉列表选择不同数据库,执行更新脚本sql.数据库少,操作感觉不到麻烦。

2、数据库多

下拉列表选择不同数据库,操作麻烦,容易遗漏更新数据库。

SQL Server Management Studio这个下拉列表,还不支持拉大缩小,数据库多了去选择不同数据库相当够呛。

二、半自动

思路:先更新一个数据库(NEWNEW),比如更新了存储过程AddSaleOrder和DeleteSaleOrder, 和执行一段sql(DELETE FROM dbo.SystemConfig WHERE ConfigName=’A’),然后通过sql参照这个数据库更新同台服务器的其他数据库。

USE[NEWNEW] 
DECLARE@nameSYSNAME 
DECLAREuserDBCURSORFORselectnamefrommaster.dbo.sysdatabasesWHERESID<>0x01 
OPENuserDB 
FETCHNEXTFROMuserDBINTO@name
WHILE(@@FETCH_STATUS=0) 
BEGIN
EXEC('use['+@name+']IF(EXISTS(SELECT1FROMdbo.sysobjectsoWHEREo.NAME=''Customer''ANDo.xtype=''U''))BEGINPRINT'''+@name+'''END') 
FETCHNEXTFROMuserDBINTO@name
END
CLOSEuserDB 
DEALLOCATEuserDB

假如输出:

DB1 

DB2 

DB3

获取一台服务器上的所有自定义数据库,select name from master.dbo.sysdatabases WHERE SID <> 0x01 通过游标再次再次过滤需要的自定义数据库(一个特殊的对象,比如:Customer表)

生成批量更新数据库的脚本:

USE[NEWNEW] 
DECLARE@objectIDINT
DECLARE@objectNameSYSNAME 
DECLARE@ObjectTypeCHAR(2) 
DECLARE@textVARCHAR(MAX) 
DECLARE@dbNameSYSNAME 
DECLAREgetNameCURSORSCROLLFORselectnamefrommaster.dbo.sysdatabasesWHERESID<>0x01ANDNAMEIN('DB1','DB2','DB3') 
OPENgetName 
DECLAREgetObjCURSORFORSELECTo.id,o.[name],o.xtypeFROMdbo.sysobjectsoWHEREo.NAMEIN('AddSaleOrder','DeleteSaleOrder')ANDo.xtypeIN('P','FN','V') 
OPENgetObj 
FETCHNEXTFROMgetObjINTO@objectID,@objectName,@ObjectType 
WHILE(@@FETCH_STATUS=0) 
BEGIN
SET@text=''
SELECT@text=@text+s.[text]FROMdbo.syscommentssWHEREs.id=@objectID 
FETCHFIRSTFROMgetNameINTO@dbName 
WHILE(@@FETCH_STATUS=0) 
BEGIN
IF(@dbName='DB1') 
USE[DB1] 
ELSEIF(@dbName='DB2') 
USE[DB2] 
ELSEIF(@dbName='DB3') 
USE[DB3] 
IF(EXISTS(SELECT1FROMdbo.sysobjectsoWHEREo.NAME=@objectNameANDo.xtype=@ObjectType)) 
BEGIN
IF(@ObjectType='P') 
EXEC('DROPPROCEDUREdbo.'+@objectName) 
ELSEIF(@ObjectType='V') 
EXEC('DROPVIEWdbo.'+@objectName) 
ELSEIF(@ObjectType='FN') 
EXEC('DROPFUNCTIONdbo.'+@objectName) 
END
EXEC(@text) 
EXEC('DELETEFROMdbo.SystemConfigWHEREConfigName=''A''') 
USE[NEWNEW] 
FETCHNEXTFROMgetNameINTO@dbName 
END
FETCHNEXTFROMgetObjINTO@objectID,@objectName,@ObjectType 
END
CLOSEgetObj 
DEALLOCATEgetObj 
CLOSEgetName 
DEALLOCATEgetName

dbo.syscomments存储的存储过程脚本,如果脚本字符超过4000字符,会多行存储。@text = @text + s.[text]累加得到脚本,没个对象更新时SET @text = ”,清除

辅助winform:

源代码下载:http://files.cnblogs.com/yinyunpan/WangshijieTool.rar

3、自动

向大家请教了。。。

原文链接:https://77isp.com/post/6897.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。