web-dev-qa-db-ja.com

トリガーに対するRAISERROR。何が起こるか?通知されますか?

テーブルのトリガーが、以下のRAISERRORコードを含むトリガーの部分にヒットするとどうなりますか?

RAISERROR('Attempt to modify supposedly immutable number.',16,1)

このコードが実行されたことをどのように知ることができますか?

2
chris

[〜#〜] 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の独自のトランザクションであり、トリガーはそのトランザクションの一部です。 ドキュメント

2
wiretext