我有SQL服務器上運行的數據庫2008RAISERROR嚴重性16不會回滾觸發
我有一個觸發器中,我養的,級別16錯誤,當我測試出現錯誤的觸發,但操作不回滾,即我在表格中增加了一行。我不明白爲什麼會這樣,因爲嚴重性16會導致回滾。我們還在其他觸發器中使用該慣例,並終止觸發器並導致回滾。
該表還有另一個不允許刪除行的觸發器。
這裏是觸發:
ALTER TRIGGER dbo.trg
ON dbo.tbl
AFTER INSERT, UPDATE
AS
BEGIN
IF (@@ROWCOUNT > 0)
IF ((SELECT COUNT(SDS.ID) AS Count0 FROM dbo.tbl SDS WHERE SDS.IsIdleTimeReferred = 0) <> 1) OR
((SELECT MAX(SDS.CreatedDate) FROM dbo.tbl SDS WHERE SDS.IsIdleTimeReferred = 0) <
(SELECT MAX(SDS.CreatedDate) FROM dbo.tbl SDS WHERE SDS.IsIdleTimeReferred = 1))
BEGIN
--IF @@TRANCOUNT > 0 ROLLBACK
RAISERROR('Only one record with value IsIdleTimeReferred=0 must exist and it must be the last one', 16, 1);
END;
END;
當我取消@@TRANCOUNT
操作行爲正確。
表tbl
包括3列:
[ID], [IsIdleTimeReferred], [CreatedDate]
我想不通問題出在哪裏。對我來說,代碼設計是正確的。
任何想法?
編輯:
好吧,我同意Severity 16
不會觸發ROLLBACK TRANSACTION。所以,我實現了下面的代碼(觸發器是AFTER INSERT, UPDATE
):
BEGIN
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
RAISERROR('Does not allow modifications in the past', 16, 1);
RETURN;
END;
此代碼不會觸發回滾事務。如果我切換行,並且第一個RAISERROR
,然後ROLLBACK
更改不會回滾。
爲什麼會發生這種情況?
P.S.我不確定我是否提出新問題或更新當前問題。我決定更新當前的一個。如果我要問新的,請告訴我。
「嚴重程度16導致回滾」 - 顯然,它不會,因爲你有代碼證明這是不正確的 - 所以你從哪裏得到這個特定的事實? –
我不能確切地告訴你在哪裏,但正如我所知嚴重性16提出錯誤,在觸發器中必須導致回滾。在另一個觸發器中,嚴重程度相同會導致回滾。 「11-16 - 指出用戶可以糾正的錯誤。」 ([MSDN](http://msdn.microsoft.com/en-us/library/ms164086.aspx)) –
嚴重性爲16可能會終止您的事務的執行,但不會回滾事務。在'RAISERROR'之後添加'ROLLBACK TRANSACTION'# ' – JodyT