您好,欢迎访问一九零五行业门户网

数据库结构同步之通过DDL触发器记录数据库结构的变更

需求: 在开发多人协作的项目的时候,一般要同时使用多个数据库 常见的情况有: 一个开发者用的数据库(开发库), 一个测试者用的数据库(测试库), 一个正式开放给客户的数据库(正式库), 那么这三个数据库之间的数据结构的同步就将成为一个问题 如:当
需求:
在开发多人协作的项目的时候,一般要同时使用多个数据库
常见的情况有:
一个开发者用的数据库(开发库),
一个测试者用的数据库(测试库),
一个正式开放给客户的数据库(正式库),
那么这三个数据库之间的数据结构的同步就将成为一个问题
如:当开发者a在“开发库”中添加了一个表,开发者b修改了一个表...
这些数据库结构的变更势必要同步到“测试库”和“正式库”中去
但肉手记录数据库结构变更的方式即麻烦由容易出错...
如之奈何?
思考过程:
之前曾在数据库达人邹建那里看到一篇帖子(找不到了),
但试过之后发现,很多情况都会出异常...就放弃了
后来在wcf达人artech这里看到一篇文章
追踪记录每笔业务操作数据改变的利器——sqlcdc
此文章是针对数据库表记录curd操作的日志
并非表结构
后来我在文章评论中向artech请教了我的问题,
得到了ddl trigger的答案 
记下来并分享
代码及解释:
use mrlh_cm;go--创建记录数据库结构变更的表create table logtable (db_user nvarchar(200), eventtype nvarchar(200), sqlstring nvarchar(2000),changetime datetime);gocreate trigger logtrigger on database for drop_table, alter_table ,create_tableasdeclare @data xmlset @data = eventdata()insert logtable (db_user, eventtype, sqlstring,changetime) values (convert(nvarchar(100), current_user), @data.value('(/event_instance/eventtype)[1]', 'nvarchar(100)'), @data.value('(/event_instance/tsqlcommand)[1]', 'nvarchar(2000)'), getdate() ) ;go
和普通的创建触发器的过程类似
就说其中的两个地方吧
1.for drop_table, alter_table ,create_table
这里只记录了这几个事件
如果记录更多的事件请使用
for ddl_database_level_events
了解更多的事件情况请访问
http://msdn.microsoft.com/en-us/library/ms186456(sql.90).aspx
2.set @data = eventdata()
eventdata()是数据库自身的方法
返回有关服务器或数据库事件的信息(xml格式)
只有直接在 ddl 或登录触发器内部引用 eventdata 时,eventdata 才会返回数据。
如果 eventdata 由其他例程调用(即使这些例程由 ddl 或登录触发器进行调用),将返回 null。
@data.value('(/event_instance/eventtype)[1]
这是使用xquery检索xml中的数据
详细的xquery教程请看这里
http://www.w3school.com.cn/xquery/index.asp
注意:
--想删除表logtable必须先删除这个触发器drop trigger logtriggeron databasego--删除表drop table logtablego
以上代码均在mssqlserver2008下测试通过
其他数据库没有测试
其它类似信息

推荐信息