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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2023-01-07
网站技术 2022-11-26
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
小游客游戏攻略网游戏攻略网 2024年07月26日
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
扫码二维码
获取最新动态