web-dev-qa-db-ja.com

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

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

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

Microsoft Docs on DML Triggers で使用されている言語は、この動作と矛盾しているようです:

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

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

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

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

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

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

その他(SQL Serverなど)* これは、DBMSです)ステートメントレベルのトリガーのみがあります。

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


* SQLサーバー - CREATE TRIGGER docs 状態:

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

24
ypercubeᵀᴹ