2009-11-06 45 views

回答

4

不,你必须通过调用ROLLBACK TRAN回滚事务:

CREATE TRIGGER trg_au_table 
ON dbo.table 
AFTER UPDATE 
AS 
BEGIN 
    ROLLBACK TRAN 
END 
GO 

这个例子将防止更新任何记录。

此:

CREATE TRIGGER trg_au_table 
ON dbo.table 
AFTER UPDATE 
AS 
BEGIN 
    RAISERROR('This is a test', 16, 1) 
END 
GO 

只会引发错误,但变化会在表格中进行。

+0

那么,是否存在隐式事务?如果我没有明确开始一个事务,ROLLBACK TRAN会导致任何问题?谢谢! – Jordan 2009-11-06 18:50:33

+0

是的,有一个隐式事务。更新和触发器在一个事务中关闭。触发器总是处于一个使用DML或DDL语句的事务中。如果您执行UPDATE,则必须等到触发器中的语句完成后再进行更新。 RAISERROR不会回滚事务。 – 2009-11-06 19:23:02

+0

注意到任何回滚语句(没有列出保存点)将回滚所有现有的打开事务。 [链接](http://stackoverflow.com/a/11469663)。 – crokusek 2014-10-09 17:06:51