WEB开发网
开发学院数据库MSSQL Server 开发库——〉测试库的架构同步 阅读

开发库——〉测试库的架构同步

 2008-11-19 10:09:56 来源:WEB开发网   
核心提示:在web开发过程中、我们往往会碰上这样的麻烦事:我们很容易利用VSTF等工具来对代码进行版本控制、但是对数据库呢?我知道有些朋友会有很好的习惯:1、每一次数据库更改的脚本,都会在第一时间保存在VSTF内,开发库——〉测试库的架构同步,使用这种方法其实其实也足够方便,但习惯培养阶段确实让人不爽、而且不免遗漏,而是想到了D

在web开发过程中、我们往往会碰上这样的麻烦事:

我们很容易利用VSTF等工具来对代码进行版本控制、但是对数据库呢?我知道有些朋友会有很好的习惯:

1、每一次数据库更改的脚本,都会在第一时间保存在VSTF内,使用这种方法其实其实也足够方便,但习惯培养阶段确实让人不爽、而且不免遗漏。

2、甚至会在解决方案中创建一个数据库项目、每一次对都在VSTS中修改数据库。 参考:http://msdn.microsoft.com/zh-cn/library/aa833253.aspx。 这种方式应该是微软所推崇的。可用起来实在不怎么方便、最受不了的是在VSTS中写存储过程!

我们总监的口号是:把工具进行到底!他使用CruiseControl.NET进行每日构建、不管使用是上面何种方法、开发库同测试库之间的同步始终没有办法自动化同步,或许是没找到正确的方法吧!如果园子里的朋友有什么高招、不防在下面回复一下!

最后我们哪种方法都没有用,而是想到了DDL触发器、在一个叫DataBaseVersion 的库中自动记录每一次的DDL操作、然后写控制台程序读取DDL操作日

志在相应的测试库中回放。再把这个控制台配置到CruiseControl.NET。 这个时候数据库的每日构建便可以进行了。

下面附上用到的DDL触发器:

Code

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [ddl_log]
ON DATABASE
FOR DDL_TABLE_EVENTS
  ,DDL_VIEW_EVENTS
  ,DDL_INDEX_EVENTS
  ,DDL_FUNCTION_EVENTS
  ,DDL_PROCEDURE_EVENTS
  ,DDL_ASSEMBLY_EVENTS
  ,DDL_SCHEMA_EVENTS
AS
  
DECLARE @EventData XML;
DECLARE @EventType NVARCHAR(50) ;
DECLARE @PostTime DATETIME ;
DECLARE @LoginName NVARCHAR(50) ;
DECLARE @UserName NVARCHAR(50) ;
DECLARE @DatabaseName NVARCHAR(50);
DECLARE @SchemaName NVARCHAR(50);
DECLARE @ObjectName NVARCHAR(500);
DECLARE @SetOptions NVARCHAR(max);
DECLARE @CommandText NVARCHAR(max);
DECLARE @IsDebug BIT ;
DECLARE @Synchronized BIT ;
DECLARE @NeedSynchronize BIT ;
DECLARE @ObjectDefinition NVARCHAR(MAX);
  
SET @EventData =EVENTDATA();
SET @EventType =@EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(50)');
SET @PostTime=@EventData.value('(/EVENT_INSTANCE/PostTime)[1]', 'DATETIME');
SET @LoginName=@EventData.value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(50)');
SET @UserName=@EventData.value('(/EVENT_INSTANCE/UserName)[1]', 'NVARCHAR(50)');
SET @DatabaseName=@EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'NVARCHAR(50)');
SET @SchemaName=@EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(50)');
SET @ObjectName=@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(500)');
SET @CommandText =@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'NVARCHAR(max)');
  
SET @IsDebug =0;
SET @Synchronized=0;
SET @NeedSynchronize=1;
SET @ObjectDefinition = OBJECT_DEFINITION (Object_ID(@DatabaseName+'.'+@SchemaName+'.'+@ObjectName)) ;
  
INSERT INTO [DataBaseVersion].[dbo].[DDLEventLog]
      ([EventData]
      ,[EventType]
      ,[PostTime]
      ,[LoginName]
      ,[UserName]
      ,[DatabaseName]
      ,[SchemaName]
      ,[ObjectName]
      ,[CommandText]
      ,[IsDebug]
      ,[Synchronized]
      ,[NeedSynchronize]
      ,[ObjectDefinition])
   VALUES
      (@EventData
      ,@EventType
      ,@PostTime
      ,@LoginName
      ,@UserName
      ,@DatabaseName
      ,@SchemaName
      ,@ObjectName
      ,@CommandText
      ,@IsDebug
      ,@Synchronized
      ,@NeedSynchronize
      ,@ObjectDefinition)
  
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [tr_ddl_log] ON DATABASE

Tags:开发 架构

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接