2014-07-21 53 views
0

我有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.我不確定我是否提出新問題或更新當前問題。我決定更新當前的一個。如果我要問新的,請告訴我。

+1

「嚴重程度16導致回滾」 - 顯然,它不會,因爲你有代碼證明這是不正確的 - 所以你從哪裏得到這個特定的事實? –

+0

我不能確切地告訴你在哪裏,但正如我所知嚴重性16提出錯誤,在觸發器中必須導致回滾。在另一個觸發器中,嚴重程度相同會導致回滾。 「11-16 - 指出用戶可以糾正的錯誤。」 ([MSDN](http://msdn.microsoft.com/en-us/library/ms164086.aspx)) –

+1

嚴重性爲16可能會終止您的事務的執行,但不會回滾事務。在'RAISERROR'之後添加'ROLLBACK TRANSACTION'# ' – JodyT

回答

0

要確保transactionroll back總是試圖使用顯式「ROLLBACK」(見Damien_The_UnbelieverJodyTAndrew評論)。所有的信貸給他們。 Kevin-Suchlicki也是對的,但在我的情況下,我不想使用SET XACT_ABORT ON