说说数据库批量更新维护

运维 数据库运维
情况:多台数据库服务器,每台服务器多个数据库,数据库结构一致(提供给不同客户使用),那么要如何维护呢?看看笔者是怎么做的吧!

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

一、手工操作

1、数据库少

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

2、数据库多

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

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

二、半自动

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

  1. USE [NEWNEW]  
  2. DECLARE @name SYSNAME  
  3. DECLARE userDB CURSOR FOR select name from master.dbo.sysdatabases WHERE SID <> 0x01  
  4. OPEN userDB  
  5. FETCH NEXT FROM userDB INTO @name 
  6. WHILE (@@FETCH_STATUS = 0)  
  7.    BEGIN 
  8.        EXEC('use [' + @name + '] IF (EXISTS(SELECT 1 FROM dbo.sysobjects o WHERE o.NAME = ''Customer'' AND o.xtype = ''U'')) BEGIN PRINT ''' + @name + ''' END')  
  9.        FETCH NEXT FROM userDB INTO @name 
  10.    END 
  11. CLOSE userDB  
  12. DEALLOCATE userDB 

假如输出:

  1. DB1  
  2.  
  3. DB2  
  4.  
  5. DB3 

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

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

  1. USE [NEWNEW]  
  2. DECLARE @objectID INT 
  3. DECLARE @objectName SYSNAME  
  4. DECLARE @ObjectType CHAR(2)  
  5. DECLARE @text VARCHAR(MAX)  
  6. DECLARE @dbName SYSNAME  
  7. DECLARE getName CURSOR SCROLL FOR select name from master.dbo.sysdatabases WHERE SID <> 0x01 AND NAME IN ('DB1' ,'DB2' ,'DB3')  
  8. OPEN getName  
  9. 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')  
  10. OPEN getObj  
  11. FETCH NEXT FROM  getObj INTO @objectID, @objectName, @ObjectType  
  12. WHILE (@@FETCH_STATUS = 0)  
  13.      BEGIN 
  14.           SET @text = '' 
  15.           SELECT @text = @text + s.[text] FROM dbo.syscomments s WHERE s.id = @objectID  
  16.           FETCH FIRST FROM getName INTO @dbName  
  17.           WHILE (@@FETCH_STATUS = 0)  
  18.                BEGIN 
  19.                    IF (@dbName = 'DB1')  
  20.                        USE [DB1]  
  21.                    ELSE IF (@dbName = 'DB2')  
  22.                        USE [DB2]  
  23.                    ELSE IF (@dbName = 'DB3')  
  24.                        USE [DB3]  
  25.                    IF (EXISTS(SELECT 1 FROM dbo.sysobjects o WHERE o.NAME = @objectName AND o.xtype = @ObjectType))  
  26.                        BEGIN 
  27.                          IF (@ObjectType = 'P')  
  28.                             EXEC ('DROP PROCEDURE dbo.' + @objectName)  
  29.                          ELSE IF(@ObjectType = 'V')  
  30.                             EXEC ('DROP VIEW dbo.' + @objectName)  
  31.                          ELSE IF(@ObjectType = 'FN')  
  32.                             EXEC ('DROP FUNCTION dbo.' + @objectName)  
  33.                        END 
  34.                    EXEC (@text)  
  35.                    EXEC ('DELETE FROM dbo.SystemConfig WHERE ConfigName=''A''')  
  36.                    USE [NEWNEW]  
  37.                    FETCH NEXT FROM getName INTO @dbName  
  38.                END 
  39.           FETCH NEXT FROM getObj INTO @objectID, @objectName, @ObjectType  
  40.      END 
  41. CLOSE getObj  
  42. DEALLOCATE getObj  
  43. CLOSE getName  
  44. 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

【编辑推荐】

  1. Mongodb源码分析--内存文件映射(MMAP)
  2. 走进MongoDB的世界 展开MongoDB的学习之旅
  3. 浅析Mongodb源码之游标Cursor
  4. 野心勃勃的NoSQL新贵 MongoDB应用实战
  5. Mongodb源码分析之Mongos分析
责任编辑:艾婧 来源: 博客园
相关推荐

2011-03-24 16:38:00

Exchange数据库维护

2018-08-09 08:59:56

数据库MySQL性能优化

2011-05-25 09:20:24

Oracle数据库

2010-11-29 11:51:59

Sybase数据库维护

2011-03-31 14:14:37

SQL Server 数据库批量更新

2010-06-03 09:49:13

2009-06-18 16:29:00

牛新庄数据库

2009-02-03 13:06:17

日常维护规范MySQL

2011-06-14 15:11:59

ORACLE

2022-12-23 07:48:23

多数据库Citus集群

2011-08-04 18:00:47

SQLite数据库批量数据

2009-03-19 10:08:09

C#数据库查询

2024-09-20 07:38:00

数据库性能策略

2011-03-28 15:28:03

SQL Server 数据库

2009-01-07 09:46:18

InformixOnline数据库

2014-02-14 09:28:55

数据中心日常维护

2010-07-09 11:28:12

SQL Server数

2009-04-24 09:15:50

Oracle维护前瞻性

2010-09-25 16:38:34

维护DHCP数据库文件

2009-12-25 17:05:32

ADO.NET数据库
点赞
收藏

51CTO技术栈公众号