2009-08-09 4 views
8

かなり一般的な質問は、表のトリガーが起動されていないと、彼らはどのような状況ではありませんか?は、彼らがどのような状況では、SQL Serverのトリガ2005</p> <p>に関する

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

私は監査ベースのデータベースを作成していますが、私が更新用に設定したトリガーを起動しないで、自分のテーブルに挿入して削除することができない状況に気づいています。

私が何を意味するかの例、

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

次の文は一度だけ更新トリガーを起動します。

+0

私は、TRUNCATEで発火しないことを学びました。 - 0120-919-03-J: –

答えて

16

いつそれらを発射しますか?

CREATE TRIGGER AFTER ACTION 

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

トリガーを持つ最大の問題は、アクションが実行されるたびに発生することです。影響を受ける行がない場合でも。これはバグではなく、気をつけなければあなたをかなり素早く燃やすことができるものです。

また、トリガーを使用すると、insertedテーブルとdeletedテーブルが使用されます。更新された行は両方にリストされます。 updateについては、delete、次にinsertと考えていないので、これは多くの人々を捨てます。

MSDNのドキュメントには、実際にトリガーが発射されるタイミングとその影響についての詳細な説明が含まれています。here

私はエリックのトリガーが火災ではないと思われる状況を掲示リンクからハイライトだろうと思って
+0

トリガーがどのように問題を引き起こすかを示す例がありますか?行は影響を受けますか?ありがとう。 –

+2

これを見てください:http://www.sqlfiddle.com/#!6/be3d3/3。私は人々に電子メールを発射する予定のトリガーを見た。行にほとんど影響を与えないレコードを挿入または更新するプロセスがあっても、それをポーリングするだけのプロセスは、かなり早く焼き付く可能性があります。経験則として、トリガで行が影響を受けていないか常に確認してください! – Eric

+0

私はこれが古いと知っていますが、挿入されたものと削除されたものの両方を使用してアップデートを説明するための投票が行われました。これは私のトリガーデザインと数時間戦った後に私のベーコンを保存しました。 – gmaness

2

TRUNCATE TABLE文が有効でDELETEですが、それが操作するので、トリガーをアクティブにすることはできません個々の行削除をログに記録しません。ただし、TRUNCATE TABLEを実行するテーブルのパーミッションを持つユーザーのみが、誤ってTRUNCATE TABLEステートメントでDELETEトリガを回避することを心配する必要があります。あなたが使用することができます2008年

5

Change Data Capture

に建てられた。またのようなトリガーが起動していないかなりの数の状況、があります。

は、テーブルが削除されます。・。

・テーブルが切り詰められています。

・ネストされたトリガーまたは再帰的なトリガーを設定すると、トリガが発生しなくなります。

・データはトリガーをバイパスしてバルクロードされます。

3

次の文は、更新トリガを1回だけ発生させます。

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

トリガーが挿入または削除された擬似対象に一度に1つの行だけ依存する場合、その擬似対象は失敗します。さらに悪いことに、エラーで失敗することはありません。トリガーが何をしても、影響を受けるすべての行には影響しません。トリガ内のループまたはカーソルでこれを修正しないで、セットベースのロジックに変更してください。トリガ内のカーソルを使用すると、アプリケーション全体を停止させることができます.50万レコードのトランザクションでは、数時間にわたってテーブルが処理され、ロックされます。

バルクは、使用するように指定しない限り、パストリガーによって挿入されます。これに注意してください。なぜなら、トリガーを渡すことによって、トリガーで発生したことがバルク挿入後に起こることを確認するコードが必要になるからです。または、FIRE_TRIGGERSオプションを使用して一括挿入を呼び出す必要があります。

関連する問題