データの一括インポート時のトリガ実行の制御
トリガは、ユーザーがテーブルやビュー内のデータを変更したときに自動的に実行される特殊な形式のストアド プロシージャです。トリガの実行は、一括インポート操作に影響を与えることがあります。たとえば、レコードがインポートされるたびに電子メールを送信するトリガが一括インポート操作で実行されると、一括インポート操作の速度が落ち、電子メールが立て続けに作成されます。
データを一括インポートするときは、一括インポート操作でトリガを実行 (起動) するかどうかを制御できます。一括インポート操作では、複数行を挿入できる INSERT トリガと INSTEAD OF トリガを持つテーブルだけ、トリガを実行する必要があります。これらのトリガの詳細については、「DML トリガ」を参照してください。
重要 |
---|
トリガが無効になっているときは、メタデータを更新するためにスキーマ変更がロックされることがあります。これにより、他のコマンド (オンラインのインデックス構築など) またはトランザクションとの競合が生じる可能性があります。たとえば、ターゲット テーブルにアクセスするスナップショット分離トランザクションは、DDL の同時変更が原因で失敗することがあります。 |
トリガが有効な場合、バッチごとに一度トリガが実行されます。
一括インポート操作中の動作は、操作に使用されているコマンドによって異なります。既定では、bcp コマンドと BULK INSERT (Transact-SQL) ステートメントではトリガが無効になります。一方、INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントでは、トリガが既定で実行されます。
既定の動作を以下の表にまとめます。
一括インポート コマンド |
既定の動作 |
---|---|
bcp |
トリガを無効にします |
BULK INSERT |
トリガを無効にします |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
トリガを実行します |
各一括インポート コマンドには修飾子が用意されています。修飾子を使用することにより、次のセクションに示すように、トリガの処理方法を変更できます。
bcp または BULK INSERT を使用したトリガの実行
既定では、bcp コマンドと BULK INSERT ステートメントではトリガが実行されません。ただし、次の修飾子を使用することにより、トリガを有効にできます。
コマンド |
修飾子 |
修飾子の種類 |
---|---|---|
bcp |
-h"FIRE_TRIGGERS" |
ヒント |
BULK INSERT |
FIRE_TRIGGERS |
引数 |
一括インポート操作に FIRE_TRIGGERS が指定されている場合、FIRE_TRIGGERS によって、テーブルで定義されている INSERT トリガと INSTEAD OF トリガが、テーブルに挿入されるすべての行に対して実行されます。
詳細については、「bcp ユーティリティ」および「BULK INSERT (Transact-SQL)」を参照してください。
INSERT ... SELECT * FROM OPENROWSET(BULK...) でのトリガの無効化
既定では、OPENROWSET 一括行セット プロバイダによりトリガが実行されます。次の修飾子を使用することによりトリガを無効にできます。
コマンド |
修飾子 |
修飾子の種類 |
---|---|---|
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH(IGNORE_TRIGGERS) |
テーブル ヒント |
このヒントが指定されていると、OPENROWSET 一括行セット プロバイダではトリガが実行されません。IGNORE_TRIGGERS ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。
トリガを有効にした状態での大きなバッチのインポート
SQL Server 2005 以降のバージョンではトリガに対して行のバージョン管理が使用され、行のバージョンが tempdb 内のバージョン ストアに格納されます。トリガを使用してデータ レコードの大きなバッチを一括インポートするには、トリガによってバージョン ストアが受ける影響に対応するために tempdb のサイズを拡張しておく必要性が生じる場合があります。詳細については、「行のバージョン管理用リソースの使用状況」を参照してください。