影響を受ける行がないにもかかわらずトリガーをトリガー


10

これはより一般的な質問ですが、この質問の動機は、SQL Serverの使用中に直面した問題でした。

このトリガーは、副作用として、行が挿入されなかった場合にエラーが発生するロジックを含むテーブルのInsertイベントにアタッチされています。さらに調査したところ、行が挿入されていないにもかかわらず、トリガーが発動していることがわかりました。

MicrosoftドキュメントのDMLトリガーで使用されている言語は、この動作と矛盾しているようです。

DMLトリガーは、トリガーで定義されたテーブルまたはビューに影響するDMLイベントが発生すると自動的に有効になる特殊なタイプのストアドプロシージャです。

これは、DBMS全体のデフォルトの動作ですか?影響を受ける行がないときにトリガーを起動する特別な理由はありますか?

回答:


24

DMLアクションには、行ベースのトリガーとステートメントベースのトリガーがあります。

  • 行トリガーは、各行が影響を受ける(前、後、または代わりに)ときに発生します(挿入/更新/削除)。したがって、100行が影響を受ける場合は100回起動し、0行が影響を受ける場合はまったく起動しません。

  • ステートメントトリガーINSERT / UPDATE / DELETEは、ステートメントが実行されると起動します。影響を受ける行がないかどうかは問題ではありません。ステートメントレベルのトリガーは、ステートメントに対して1回だけ発生します(影響を受ける行が0、100、または10億かどうか)。

一部のDBMSには、行レベルのトリガー(MySQL)しかありません。

その他(DBMSであるSQL Server *など)には、ステートメントレベルのトリガーしかありません。

他の一部(DB2、Oracle、Postgres)には、両方の種類のトリガーがあります。


* SQL ServerのCREATE TRIGGERドキュメントの状態:

DMLトリガーは、ユーザーがデータ操作言語(DML)イベントを通じてデータを変更しようとしたときに実行されます。DMLイベントはINSERT、テーブルまたはビューの、、UPDATEまたはDELETEステートメントです。これらのトリガーは、テーブルの行が影響を受けるかどうかに関係なく、有効なイベントが発生すると発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.