RAISEERROR或抛出触发器来回滚DML语句

时间:2013-08-28 09:05:15

标签: tsql triggers throw raiseerror

只是说我在下面的触发器中有一个throw或RaiseError

IF OBJECT_ID('Sales.OrderDetails_AfterTrigger', 'TR') IS NOT NULL
DROP Trigger Sales.OrderDetails_AfterTrigger;
GO
CREATE TRIGGER Sales.OrderDetails_AfterTrigger ON Sales.OrderDetails
AFTER INSERT, UPDATE
AS
BEGIN
IF @@ROWCOUNT = 0 RETURN;
SET NOCOUNT ON;
-- Check all rows
IF EXISTS(...)
BEGIN
RAISERROR  ('This error message is not displayed', 10, 1 ) 
END
END
GO

如果在触发器中抛出raiseerror将阻止dml语句被回滚?

只是我发现在发生这种情况时我仍然会插入行。

1 个答案:

答案 0 :(得分:1)

查看microsoft http://msdn.microsoft.com/en-us/library/ms178592.aspx

的提升错误页面中的备注部分
  

“当在TRY块中以高于11或更高的严重性运行RAISERROR时,它将控制转移到相关的CATCH块”

你投掷10个控件不会进入catch语句。 如果你试图在那里阻止它,那将对你的调用代码流有所帮助(不是很难说明)。

但是!!你评论说仍然插入了行。 我怀疑你应该使用插入更新触发器而不是“后”触发器。

由于您已经插入了10行,因此您的行已经插入,并且不会破坏事务。

抱歉,如果不知道你在调用插入/更新语句触发触发器的上下文,那么就不会更精确但有点难以理解