我有一个触发器,需要有审核功能,以审核对表的一些更改。如果满足一定的逻辑条件,则确认事务回滚,回滚这些更改。但是希望能够看到这些更改的内容和动作。请教,怎么处理。

解决方案 »

  1.   

    下面是我在开发服务器部署的,获取开发人员对整个数据库的DDL操作,并记录在一个表中,你可以拿去改一下。判断如果有数据,就插入一个表,然后回滚这个事务。但是由于你的判断条件可能很复杂,所以其实不好搞。个人觉得预期花大力气在这方面,还不如管控权限来的简单。另外,试一下尝试2008以后出现的【基于策略管理】的功能。CREATE TRIGGER [DDLTriggertTrace] ON DATABASE
    --捕获存储过程、视图、表的创建、修改、删除动作
        FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, CREATE_VIEW,
            ALTER_VIEW, DROP_VIEW, CREATE_TABLE, ALTER_TABLE, DROP_TABLE
    AS
        BEGIN
            SET NOCOUNT ON ;
            DECLARE @EventData XML = EVENTDATA() ;--返回有关服务器或数据库事件的信息,以XML格式保存。
            DECLARE @ip VARCHAR(32) = ( SELECT  client_net_address
                                        FROM    sys.dm_exec_connections
                                        WHERE   session_id = @@SPID
                                      ) ;        INSERT  AuditDB.dbo.DDLEvents
                    ( EventType ,
                      EventDDL ,
                      EventXML ,
                      DatabaseName ,
                      SchemaName ,
                      ObjectName ,
                      HostName ,
                      IPAddress ,
                      ProgramName ,
                      LoginName
                    )
                    SELECT  @EventData.value('(/EVENT_INSTANCE/EventType)[1]',
                                             'NVARCHAR(100)') ,
                            @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]',
                                             'NVARCHAR(MAX)') ,
                            @EventData ,
                            DB_NAME() ,
                            @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',
                                             'NVARCHAR(255)') ,
                            @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',
                                             'NVARCHAR(255)') ,
                            HOST_NAME() ,
                            @ip ,
                            PROGRAM_NAME() ,
                            SUSER_SNAME() ;
        ENDGO
      

  2.   

    触发器不能实现你的既回滚有记录因为逻辑是判断有满足条件的 需要回滚操作,然后把这些记录到另一个表里面
    但是在触发器里面指定rollback tran 的时候会回滚,但是会抛出一个错误,并终止操作
    所以你记录到另一个表的操作就无法执行了。所以只能判断满足条件的不更新。
      

  3.   

    1、一般情况下可以先判断逻辑条件,符合的在进行更改
    2、如果业务需求,可以在事务回滚之前,将inserted\deleted表中的数据复制到表变量中后再执行回滚,然后在触发器新事务中把数据从表变量复制到审核表中。(注意事务中不要用临时表,临时表的数据在事务回滚前后都会被撤销而不存在)