DDL(Data Definition Language)触发器实现数据库版本控制

   SQL SERVER 2005支持DDL触发器,不过网上的介绍的应用场合一般都是来阻止非法用户对数据库结构的修改,其实既然可以监视数据结构的变化,就可以记录数据结构更改记录咯。于是就做了个数据库版本控制的小工具,主要就是利用DDL触发器来捕捉提交的更改。
    1.创建控制支撑的数据库DBController记录数据库更改历史。
      数据库核心表 t_version_details
           
2.核心触发器
     trigger sql:
CREATE   TRIGGER  Trig_DBVersionController
ON   DATABASE
FOR  CREATE_TABLE, ALTER_TABLE, DROP_TABLE,
    CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
    CREATE_INDEX, ALTER_INDEX, DROP_INDEX,
    CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
    CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER,
    CREATE_VIEW, ALTER_VIEW, DROP_VIEW
AS
    
SET  NOCOUNT  ON
    
DECLARE   @data   AS  xml
    
DECLARE   @clientUser   AS   nvarchar ( 128 )
    
DECLARE   @spid   AS   nvarchar ( 128 )
    
DECLARE   @serverName   AS   nvarchar ( 128 )
    
DECLARE   @dbName   AS   nvarchar ( 128 )
    
DECLARE   @dbid   AS   int
    
DECLARE   @objName   AS   nvarchar ( 512 )

    
SELECT   @data   = EVENTDATA()
    
SELECT   @spid   =   @data .value( ' (/EVENT_INSTANCE/SPID)[1] ' , ' nvarchar(128) ' )
    
SELECT   @serverName   =   @data .value( ' (/EVENT_INSTANCE/ServerName)[1] ' , ' nvarchar(256) ' )
    
SELECT   @dbName   =   @data .value( ' (/EVENT_INSTANCE/DatabaseName)[1] ' , ' nvarchar(128) ' )
    
SELECT   @objName   =   @data .value( ' (/EVENT_INSTANCE/ObjectName)[1] ' , ' nvarchar(128) ' )

    
SELECT   @dbid   =  dbid  FROM  sys.sysdatabases 
    
WHERE  name  =   @dbName  

ExpandedBlockStart.gifContractedBlock.gif    
/**/ /*获取客户机的机器名*/
    
SELECT   @clientUser = hostname  FROM  master..sysprocesses  WHERE  spid = @spid
    
--  add version record
     INSERT   INTO  DBController.dbo.t_version_details
    (post_computer_name, sys_dbid, uid, 
[ schema ] ,
    PostTime, EventType, ObjectType, ObjectName, CommandText, Remark)
    
VALUES
    (
@clientUser @dbid ,
    
@data .value( ' (/EVENT_INSTANCE/LoginName)[1] ' , ' nvarchar(256) ' ), 
    
@data .value( ' (/EVENT_INSTANCE/UserName)[1] ' , ' nvarchar(256) ' ),
    
@data .value( ' (/EVENT_INSTANCE/PostTime)[1] ' , ' datetime ' ),
    
@data .value( ' (/EVENT_INSTANCE/EventType)[1] ' , ' nvarchar(128) ' ), 
    
@data .value( ' (/EVENT_INSTANCE/ObjectType)[1] ' , ' nvarchar(128) ' ),
    
@objName ,
    
@data .value( ' (/EVENT_INSTANCE/TSQLCommand/CommandText)[1] ' , ' nvarchar(max) ' ),
    
''
    )
    3.只要在目标数据库上创建这个触发器就可以记录版本了

转载于:https://www.cnblogs.com/iImax/archive/2009/04/20/1439639.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值