触发器问题! 我有一个触发器,需要有审核功能,以审核对表的一些更改。如果满足一定的逻辑条件,则确认事务回滚,回滚这些更改。但是希望能够看到这些更改的内容和动作。请教,怎么处理。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 下面是我在开发服务器部署的,获取开发人员对整个数据库的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_TABLEAS 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 触发器不能实现你的既回滚有记录因为逻辑是判断有满足条件的 需要回滚操作,然后把这些记录到另一个表里面但是在触发器里面指定rollback tran 的时候会回滚,但是会抛出一个错误,并终止操作所以你记录到另一个表的操作就无法执行了。所以只能判断满足条件的不更新。 1、一般情况下可以先判断逻辑条件,符合的在进行更改2、如果业务需求,可以在事务回滚之前,将inserted\deleted表中的数据复制到表变量中后再执行回滚,然后在触发器新事务中把数据从表变量复制到审核表中。(注意事务中不要用临时表,临时表的数据在事务回滚前后都会被撤销而不存在) 如何读取存储过程中返回的多表集数据 哪里有下SQL Server的补丁 多表查询,谢谢高手指教啊 为什么有大量的“未发布的命令” 有个事务的问题向不明白 重赏之下必有勇夫--强烈寻找WINDOWS编程书籍! 怎么用SQL把表中的一列的数据考到另一列 斑竹,不要意思再次麻烦! 用pb编酒店管理系统,如何实现c/s模式? 数据库测试教程 取表中第7条到第10条记录 数据表设计寻求一解决方案
--捕获存储过程、视图、表的创建、修改、删除动作
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
但是在触发器里面指定rollback tran 的时候会回滚,但是会抛出一个错误,并终止操作
所以你记录到另一个表的操作就无法执行了。所以只能判断满足条件的不更新。
2、如果业务需求,可以在事务回滚之前,将inserted\deleted表中的数据复制到表变量中后再执行回滚,然后在触发器新事务中把数据从表变量复制到审核表中。(注意事务中不要用临时表,临时表的数据在事务回滚前后都会被撤销而不存在)