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



只需说我在下面的触发器中有一个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

如果在触发器中抛出raiserror,会阻止dml语句回滚吗?

只是我注意到,当这种情况发生时,我仍在插入行。

请查看来自microsoft的引发错误页面中的备注部分http://msdn.microsoft.com/en-us/library/ms178592.aspx

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

你投了10分,所以控制权不会落到接球陈述上。如果你试图在那里停止调用,这将有助于你的调用代码流(没有显示得很难判断)。

但是!!您作出的注释是行仍在插入。我怀疑您可能应该使用insert-update触发器,而不是"after"触发器。

由于您抛出了10,所以您的行已经插入,并且不会破坏事务。

抱歉,如果不知道您正在调用触发的insert/update语句的上下文,这是非常准确的,但有点困难

相关内容

  • 没有找到相关文章

最新更新