2013-08-27 40 views
1

我有一個DDL觸發器來審計對服務器上發生的任何DDL事件的更改。T-SQL TRY-CATCH不能在DDL觸發器中工作

觸發器中的代碼讀取eventdata並將其寫入表中。

我想在TSQL try-catch中包裝該操作,因此如果因爲任何原因失敗,那麼我會將故障記錄到SQL日誌中,但讓操作通過,但似乎不起作用。 我已經在使用如果存在以確保我需要寫入的表仍然存在,但我想要捕獲任何未知的錯誤並使觸發器儘可能健壯。

DDL觸發器似乎工作不同於正常的T-SQL,似乎並沒有兌現TRY-CATCH塊。

下面的代碼工作正常,如果它是在一個SP中但它不工作,如果它在DDL觸發器中。

BEGIN TRY 
-- Simulate an error 
RAISERROR ('Just a test!', 14, 1); 
END TRY 

BEGIN CATCH 
DECLARE @errorNumber INT = ERROR_NUMBER() 
DECLARE @errorMessage NVARCHAR(2048) = ERROR_MESSAGE() + '(' 
    + CAST(ERROR_NUMBER() AS NVARCHAR) + ')' 

-- Log the error to the SQL server event log 
EXEC master..xp_logevent 50005, @errorMessage, WARNING 
END CATCH; 

任何想法?

+0

http://dba.stackexchange.com/questions/8693/why-try-catch-does-not-suppress-exception -in-trigger – bummi

+0

在我使用'CATCH'的經驗中,如果你不在catch中拋出一個錯誤,它將執行你在catch塊中指定的任何內容,但不會將某個工作標記爲失敗。 –

回答