火とするとき、彼らはないがトリガされないとき
-
12-09-2019 - |
質問
かなり一般的な質問ます。
どのような状況では、テーブルのトリガは、焼成し、彼らがどのような状況ではないですね。
を証明するために、任意のコード例は、素晴らしいことだ。
私は、監査ベースのデータベースを書いているだけでは、私が更新のために設定したトリガをオフに解雇削除し、私のテーブルに挿入していない可能性のある状況を認識することにしたい。
私が何を意味するかの例では、
UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);
次の文は一度だけ更新トリガーを起動します。
解決
するとき、あなたはそれらを解雇したいですか?
CREATE TRIGGER AFTER ACTION
アクション(insert update delete
)がコミットされた後に実行されること。 INSTEAD OF
は、アクションの代わりにトリガーを起動ます。
のトリガーの最大の落とし穴の一つは、アクションががの何行が影響を受けていない場合であっても、実行されるたびに、彼らは火ということです。これはバグではありません、それはあなたが注意されていない場合かなり迅速にあなたを燃やすことができるものです。
また、トリガで、あなたはinserted
とdeleted
テーブルを使用することがあります。更新された行は、両方に記載されています。彼らはその後、update
delete
としてinsert
について考えるために使用されていないので、これは、人々オフの多くをスローします。
MSDNのドキュメントは、実際に火をトリガーとする場合についてかなりの深い議論を持って、彼らがどのような影響を与えるのか<のhref = "https://msdn.microsoft.com/en-us/library/ms189799(v=sql。 130)」REL = "noreferrer">こちら。
をの.aspx他のヒント
2008年、あなたはのキャプチャチェンジ・データで構築を使用することができますP>
また、のようなトリガーが起動していないかなりの数の状況がありますが、
・テーブルが削除されます。
・テーブルが切り捨てられます。
ネストされたおよび/または再帰トリガーが発射からのトリガを防ぐためです。・設定
・データは、トリガーをバイパスし、バルクロードされています。
次の文は一度だけ更新トリガーを起動します。
任意のアクションタイプのステートメントは、唯一のトリガーが複数の行挿入/更新/削除を処理するために記述する必要があります、影響を受ける行数を一度に関係なくトリガーを起動ます。
あなたのトリガーが挿入または削除pseudotablesにある時にのみ1行に依存している場合、、それが失敗します。さらに悪いことはエラーで失敗することはありません、それは単にあなたがトリガがないものは何でもすることにより、影響を受けたいすべての行には影響しません。 、トリガーのループまたはカーソル経由するチェンジセットベースのロジックをこの問題を解決しないでください。トリガーでのカーソル50万のレコードのプロセスのトランザクション中に急停止にあなたの全体のアプリを持参し、時間のテーブルをロックすることができます。
あなたがそれらを使用するように指定しない限り、パスで一括挿入をトリガします。あなたがそれらを聞かせてトリガを渡した場合、あなたはまた、トリガーで起こる一括挿入後に起こるどんなことを確認するためのコードが必要になりますので、これを注意してください。それとも、FIRE_TRIGGERSオプションを指定して一括挿入を呼び出す必要があります。
私はエリックはこれでトリガーが考えていない火災の状況を掲示リンクからハイライトだろうと思って
操作は、個々の行の削除をログに記録していないため、TRUNCATE TABLE文が有効でDELETEですが、それはトリガーをアクティブにすることはできません。しかし、唯一の権限を持つこれらのテーブルの上にTRUNCATE TABLEを実行するには、不注意TRUNCATE TABLE文とDELETEトリガを回避心配する必要があります。