只需说我在下面的触发器中有一个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语句的上下文,这是非常准确的,但有点困难