我有一个SQL触发器的问题。这是一个“AFTER INSERT”触发器。它适用于每个IF EXISTS块,除了具有更新和引发错误组合的块,如下所示。它要么更新并继续前进,要么停止更新。SQL触发器 - 插入后 - Update语句和RAISERROR不工作
代码:(我已关闭 - 在它的多个不同的尝试,他们都失败了)
IF EXISTS (SELECT
[RPS].[Slip]
FROM
[DC].[dbo].[Slips] AS [RPS]
WHERE
[RPS].[Slip] = @ps
AND [RPS].[Status] = 0)
BEGIN
BEGIN TRAN;
UPDATE
[DC].[dbo].[Slips]
SET
[Slip].[Status] = 1
FROM
[DC].[dbo].[Slips]
WHERE
[Slips].[Slip] = @ps;
SET @msg = ' ' + @NewLine + 'Inv. Decremented - Rollback' + @NewLine + 'Contact HD.' + @NewLine;
RAISERROR (@msg,16,1);
COMMIT TRAN;
RETURN;
END;
的目标是表更新为1时,如果存在则是抓住并触发状态RAISERROR。 RAISERROR被java代码拾取并停止处理。如果我更新了该触发器,则会引发错误并停止。如果我把加注错误拿出来,触发器会更新但会继续 - 我不想要那个...我想要我的蛋糕并且也吃它!
想法?
触发器启动一个隐式事务,所以你在触发器中的显式事务实际上是一个嵌套事务。 SQL Server不尊重嵌套事务,并且可能在那里发生了一些奇怪的事情。我只是删除你的明确交易,看看它是否适合你。 –
更正以上评论。这并不是说SQL Server“不尊重嵌套事务”,但语义可能与你期望的有所不同。 SQL Server跟踪'@@ trancount'中的嵌套级别,并且只有外部'commit'(导致'@@ trancount'从1变为0的那个)将实际提交事务。然而,回滚(没有保存点)会回滚一个以“@@ trancount”为0的事务。 –
BEGIN TRAN是多余的。它可以安全地删除而不影响触发器的行为,因为@JohnSpecko指出已经有一个隐式事务。然而,我不指望这能解决你遇到的任何问题。 [DC]。[dbo]。[Slips]是否有更新触发器,并且该更新触发器中是否有任何可能的ROLLBACK语句?可能发生的情况是,ROLLBACK正在回滚所有嵌套事务,包括你的工作。 –