2013-07-24 81 views
0

在Sql Server 2008中,我被要求編寫觸發器在我構建的應用程序中執行各種類型的日誌記錄。問題是我的SQL是生鏽的,有時我在觸發器中執行日誌的一些事情會意外地出錯。我打算最終計算出所有錯誤,但同時我的觸發器代碼正在破壞我的應用程序,因爲如果觸發器意外失敗,它會回滾更新或插入,從而觸發它破壞應用程序的各個部分。我試圖在觸發器代碼中放置一個try catch塊,但是它似乎並沒有做到我習慣於在其他語言中做的事情,並且即使這樣做也會回滾原始事務。防止sql觸發器回滾原始事務出錯

有沒有人知道/如果你可以寫一個觸發器,當它發生錯誤時,它只是優雅地死掉,並讓觸發它的事務完成?

+1

檢查 - http://stackoverflow.com/questions/17722967/how-to-ignoring-errors-in-trigger-and-perform-respective-operation-in-ms-sql-ser/ 17724709#17724709我認爲修復觸發器更容易,更好,因此不會出錯。 –

+0

[http://stackoverflow.com/a/2163041/1114171](http://stackoverflow.com/a/2163041/1114171) –

+1

通常最好從觸發器排隊工作,然後拿起排隊的工作在它自己的事務中並從那裏繼續(通過服務代理,SQL代理作業等)。但是這個建議只有在你能夠理解基礎時纔有效。 –

回答

2

您可以將您的觸發器正文代碼放入try-catch block

CREATE TRIGGER tg 
ON tt 
AFTER DELETE 
AS 
    set xact_abort off; 
    BEGIN TRY 
     sql_statements 
    END TRY 
    BEGIN CATCH 
      dies gracefully 
    END CATCH; 

記得設置xact_abort爲關閉,以避免自動回滾當前事務。

sql fiddle sample