10

SQL Server 2005 のトリガーに関するかなり一般的な質問です。

どのような状況でテーブル トリガーが起動され、どのような状況で起動されないか?

デモンストレーションするコード例はどれも素晴らしいでしょう。

私は監査ベースのデータベースを作成していますが、テーブルの更新、削除、および挿入用に設定したトリガーが起動しない可能性がある状況に注意したいだけです。

私が言いたいことの例、

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);

次のステートメントは、更新トリガーを 1 回だけ起動します。

4

4 に答える 4

21

いつ発砲させたいですか?

CREATE TRIGGER AFTER ACTION

これは、アクション ( insert update delete) がコミットされた後に実行されます。INSTEAD OFアクションの代わりにトリガーを起動します。

トリガーに関する最大の問題の 1 つは、影響を受ける行がない場合でも、アクションが実行されるたびにトリガーが起動することです。これはバグではなく、注意しないとすぐに火傷を負う可能性があります。

また、トリガーでは、insertedおよびdeletedテーブルを使用します。更新された行は両方にリストされます。多くの人は、 をthenupdateとして考えることに慣れていないため、これに戸惑います。deleteinsert

MSDN のドキュメントには、トリガーがいつ起動し、どのような影響があるかについて、かなり詳細な説明が記載されています

于 2009-08-09T05:51:12.753 に答える
5

2008 では、組み込みの変更データ キャプチャを使用できます。

また、次のようなトリガーが起動しない状況がかなりあります。

· テーブルが削除されます。

· テーブルが切り捨てられます。

· ネストされたトリガーや再帰的トリガーの設定により、トリガーが起動されなくなります。

· データはトリガーをバイパスして一括ロードされます。

于 2009-08-09T21:52:24.290 に答える
3

次のステートメントは、更新トリガーを1回だけ起動します。

アクションタイプステートメントは、影響を受ける行の数に関係なく、トリガーを1回だけ起動します。トリガーは、複数の行の挿入/更新/削除を処理するように作成する必要があります。

トリガーが、挿入または削除された疑似テーブルに一度に1つの行のみに依存している場合、トリガーは失敗します。さらに悪いことに、エラーで失敗することはなく、トリガーが何をしても影響を受けたいすべての行に影響を与えることはありません。トリガーのループまたはカーソルを介してこれを修正しないでください。セットベースのロジックに変更してください。トリガーにカーソルを合わせると、500,000レコードのトランザクションが処理され、テーブルが数時間ロックされる間、アプリ全体が急停止する可能性があります。

使用を指定しない限り、パストリガーによる一括挿入。トリガーをバイパスさせる場合は、トリガーで発生することが一括挿入後にも発生することを確認するためのコードが必要になるため、これに注意してください。または、FIRE_TRIGGERSオプションを使用して一括挿入を呼び出す必要があります。

于 2009-08-10T21:00:35.667 に答える
2

トリガーが起動しない状況を Eric が投稿したリンクからハイライトしたいと思います。

TRUNCATE TABLE ステートメントは実際には DELETE ですが、この操作では個々の行の削除がログに記録されないため、トリガーをアクティブにすることはできません。ただし、TRUNCATE TABLE ステートメントを使用して誤って DELETE トリガーを回避することを心配する必要があるのは、テーブルに対する TRUNCATE TABLE を実行する権限を持つユーザーだけです。

于 2009-08-09T08:12:51.233 に答える