テーブルのトリガーが、以下のRAISERRORコードを含むトリガーの部分にヒットするとどうなりますか?
RAISERROR('Attempt to modify supposedly immutable number.',16,1)
このコードが実行されたことをどのように知ることができますか?
[〜#〜] raiserror [〜#〜] によって生成されるエラーは、データベースエンジンコードによって生成されるエラーと同じように動作します。 RAISERROR
で指定された値は、ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE, and @@ERROR
システム関数。 RAISERROR
が重大度11以上でTRY
ブロックで実行されると、関連するCATCH
ブロックに制御が移ります。 RAISERROR
を実行すると、エラーが呼び出し元に返されます。
TRYブロックの範囲外。
TRYブロックの重大度が10以下。
データベース接続を終了する重大度20以上。
トリガーコンテキストにいる場合、すべてのエラーによってバッチが終了し、その場でトランザクションがロールバックされます。
SQL Serverのエラー処理に関しては、例外がなければ有効なルールはありません。 RAISERROR
を使用して発生したエラーは、トリガーコンテキストであってもバッチを中止しません
トリガーがバッチを終了できるもう1つの方法があります。これは@@trancount
は、トリガーが終了すると0になります。トリガーは常にトランザクションのコンテキストで実行されます。これは、進行中のマルチステートメントトランザクションがない場合でも、各INSERT, UPDATE and DELETE
ステートメントはSQL Serverの独自のトランザクションであり、トリガーはそのトランザクションの一部です。 ドキュメント