1

只是说我在下面的触发器中有一个 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 语句回滚吗?

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

4

1 回答 1

1

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

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

你扔一个 10 所以控制不会进入 catch 语句。如果您试图在此处停止调用代码流,这将有助于您的调用代码流(没有显示出来很难说)。

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

由于您抛出 10 行,因此您的行已被插入,并且不会中断事务。

抱歉,再精确不过了,但在不知道您调用的触发触发器的插入/更新语句的上下文的情况下有点困难

于 2013-08-28T11:14:12.417 回答