DML トリガの実行
制約違反が発生した場合は、AFTER トリガは実行されません。したがってこのトリガは、制約違反を防ぐための処理には使用できません。
INSTEAD OF トリガは、トリガ起動動作の代わりに実行されます。INSTEAD OF トリガは、ベース テーブルへの変更内容を反映する inserted テーブルおよび deleted テーブルが作成された後、それ以外の動作が行われる前に実行されます。またすべての制約処理の前に実行されます。その結果、制約動作を補足する前処理を実行できます。
テーブルに定義された INSTEAD OF トリガが、通常であれば再度 INSTEAD OF トリガを起動するようなステートメントをそのテーブルに対して実行しても、そのトリガの再帰的な呼び出しは行われません。代わりに、そのステートメントは、テーブルに INSTEAD OF トリガが存在しないかのように処理され、制約操作と AFTER トリガの実行が連鎖的に開始されます。たとえば、あるテーブルに INSTEAD OF INSERT トリガとして定義された DML トリガによって、同じテーブルに INSERT ステートメントが実行される場合、INSTEAD OF トリガによって実行された INSERT ステートメントによって、そのトリガが再度呼び出されることはありません。トリガによって実行された INSERT により、制約動作を実行してそのテーブル用に定義されている AFTER INSERT トリガを起動する処理が開始されます。
ビューに定義された INSTEAD OF トリガが、通常であれば再度 INSTEAD OF トリガを起動するステートメントをそのビューに対して実行しても、そのトリガの再帰的な呼び出しは行われません。代わりに、そのステートメントは、そのビューの基になるベース テーブルに対する変更として解決されます。この場合、ビューの定義は更新可能なビューに課されるすべての制限を満たしている必要があります。更新可能なビューの定義の詳細については、「ビューを使用したデータ変更」を参照してください。たとえば、あるビューに INSTEAD OF UPDATE トリガとして定義された DML トリガによって、同じビューを参照する UPDATE ステートメントが実行しても、INSTEAD OF トリガによって実行された UPDATE ステートメントが、そのトリガを再度呼び出すことはありません。トリガによって実行された UPDATE ステートメントは、そのビューに INSTEAD OF トリガが存在しないかのように処理されます。その UPDATE によって変更された列は、単一のベース テーブルに解決される必要があります。基になるベース テーブルを変更するたびに、制約の適用およびそのテーブル用に定義された AFTER トリガの起動が連鎖的に開始されます。
DML トリガはパフォーマンスのオーバーヘッドが通常は少なくて済みます。DML トリガの実行時間の大半は、メモリまたはデータベース デバイスにある他のテーブルを参照するために費やされます。deleted テーブルおよび inserted テーブルは常にメモリ上にあります。トリガにより参照する他のテーブルの位置が、操作にかかる時間を決定します。
注意 |
---|
DML トリガにカーソルを使用することは、パフォーマンスに悪影響を与える可能性があるため、お勧めしません。複数行に影響を与える DML トリガをデザインする場合は、カーソルではなく行セットをベースにしたロジックを使用してください。 |
DML トリガの実行とパーティション ビュー
パーティション ビューの基になるテーブルでの UPDATE トリガと DELETE トリガの起動方法は、SQL Server 2000 の場合とは異なります。SQL Server 2000 では、UPDATE ステートメントまたは DELETE ステートメントがローカル パーティション ビューまたは分散パーティション ビューのいずれかに対して実行されると、そのビューのベース テーブルで定義された UPDATE トリガまたは DELETE トリガが起動されます。これらのトリガは、更新または削除操作によって影響を受けないテーブルでも起動されます。SQL Server 2008 および SQL Server 2005 では、UPDATE トリガまたは DELETE トリガが起動されるのは、トリガが定義されているベース テーブルが更新操作または削除操作による影響を受ける場合だけです。この動作は、AFTER トリガおよび INSTEAD OF トリガと同じです。
たとえば、テーブル T1 と T2 のフィールドで構成されたパーティション ビュー PV があるとします。また、T1 と T2 の両方で UPDATE トリガが定義されているとします。SQL Server 2000 では、T1 の行にのみ影響を与える PV に対して UPDATE ステートメントが実行された場合、T1 と T2 の両方で UPDATE トリガが起動されます。SQL Server 2008 および SQL Server 2005 では、T1 で定義された UPDATE トリガだけが起動されます。
次の表に動作の変更を示します。
ローカル パーティション ビューでの挿入、更新、または削除操作
|
SQL Server 2000 |
現在のリリース |
---|---|---|
INSERT トリガ |
影響を受けるテーブルでのみ起動されます。 |
影響を受けるテーブルでのみ起動されます。 |
UPDATE トリガ |
この種類のトリガが定義されたパーティション ビューの基になるすべてのテーブルで起動されます。 |
影響を受けるテーブルでのみ起動されます。 |
DELETE トリガ |
この種類のトリガが定義されたパーティション ビューの基になるすべてのテーブルで起動されます。 |
影響を受けるテーブルでのみ起動されます。 |
分散パーティション ビューでの挿入、更新、または削除操作
|
SQL Server 2000 |
現在のリリース |
---|---|---|
INSERT トリガ |
影響を受ける分散パーティション ビューのテーブルでのみ起動されます。ローカル インスタンスとリモート インスタンスのテーブルで定義されたトリガは、そのテーブルが影響を受ける場合に起動できます。 |
影響を受ける分散パーティション ビューのテーブルでのみ起動されます。ローカル インスタンスとリモート インスタンスのテーブルで定義されたトリガは、そのテーブルが影響を受ける場合に起動できます。 |
UPDATE トリガ |
この種類のトリガが定義されたパーティション ビューの基になるすべてのテーブルで起動されます。 |
この種類のトリガが定義されたリモート インスタンスのすべてのテーブルで起動されます。ローカル インスタンスでは影響を受けるテーブルでのみ起動されます。 |
DELETE トリガ |
この種類のトリガが定義されたパーティション ビューの基になるすべてのテーブルで起動されます。 |
この種類のトリガが定義されたリモート インスタンスのすべてのテーブルで起動されます。ローカル インスタンスでは影響を受けるテーブルでのみ起動されます。 |