我有一個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正在回滾所有嵌套事務,包括你的工作。 –