データの一括インポート時のトリガ実行の制御

トリガは、ユーザーがテーブルやビュー内のデータを変更したときに自動的に実行される特殊な形式のストアド プロシージャです。トリガの実行は、一括インポート操作に影響を与えることがあります。たとえば、レコードがインポートされるたびに電子メールを送信するトリガが一括インポート操作で実行されると、一括インポート操作の速度が落ち、電子メールが立て続けに作成されます。

データを一括インポートするときは、一括インポート操作でトリガを実行 (起動) するかどうかを制御できます。一括インポート操作では、複数行を挿入できる 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 のサイズを拡張しておく必要性が生じる場合があります。詳細については、「行のバージョン管理用リソースの使用状況」を参照してください。