zoukankan      html  css  js  c++  java
  • 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 

        
    /*获取客户机的机器名*/
        
    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.只要在目标数据库上创建这个触发器就可以记录版本了
  • 相关阅读:
    Xamarin Forms 的一个小事故 dotNET界面
    求极限求无限数相加算法
    C# 获取鼠标位置
    入门级XML学习(三)
    DateTime 获取时间
    《人工智能的未来》经典语录
    VS编辑器 高亮消失如何恢复
    C# 获取桌面
    导出EXECL 2003正常 2007 不正常问题
    css 控制div高度自适应浏览器的高度
  • 原文地址:https://www.cnblogs.com/iImax/p/1439639.html
Copyright © 2011-2022 走看看