サーバーで発生する DDL イベントへの変更を監査する DDL トリガーがあります。
トリガー内のコードは、イベントデータを読み取り、それをテーブルに書き込みます。
その操作を TSQL の try-catch でラップしたいので、何らかの理由で失敗した場合は、障害を SQL ログに記録しますが、操作は実行されますが、うまくいかないようです。書き込む必要があるテーブルがまだ存在することを確認するために if exists を既に使用していますが、予期しないエラーをトラップし、トリガーを可能な限り堅牢にしたいと考えています。
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;
何か案は?