適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
DML トリガーは、トリガーで定義されているテーブルまたはビューに影響を与えるデータ操作言語 (DML) イベントが発生したときに自動的に有効となる特殊なストアド プロシージャです。 DML イベントには、 INSERT
、 UPDATE
、または DELETE
ステートメントが含まれます。 DML トリガーを使用して、ビジネス ルールやデータの整合性を強制的に適用したり、他のテーブルを照会したりできるほか、複雑な Transact-SQL ステートメントを使用することもできます。 トリガーとそのトリガーを起動するステートメントは単一のトランザクションとして扱われ、このトランザクションはトリガー内からロールバックできます。 ディスクの空き容量の不足などの重大なエラーが検出されると、このトランザクション全体が自動的にロールバックされます。
メリット
エンティティの整合性またはドメインの整合性を適用できるという点で、DML トリガーは制約に似ています。 一般に、エンティティの整合性は、 PRIMARY KEY
制約と UNIQUE
制約の一部であるインデックス、または制約とは別に作成されるインデックスによって、常に最低レベルで適用する必要があります。 ドメインの整合性は CHECK
制約を使用して適用し、参照整合性 (RI) は FOREIGN KEY
制約によって適用する必要があります。 DML トリガーは、制約によってサポートされる機能がアプリケーションの機能ニーズを満たさない場合に最も役立ちます。
以下に DML トリガーと制約を比較し、どのような場合に DML トリガーが制約よりも有利となるかを示します。
DML トリガーでは、データベースの関連テーブルを使用して変更を連鎖することができます。ただし、連鎖参照整合性制約を使用すると、これらの変更をより効率的に実行できます。
FOREIGN KEY
制約では、REFERENCES
句でカスケード参照アクションが定義されていない限り、別の列の値と完全に一致する列値のみを検証できます。悪意のある操作や不適切な
INSERT
、UPDATE
、DELETE
操作から保護し、CHECK
制約で定義されている制限よりも複雑なその他の制限を適用できます。CHECK
制約とは異なり、DML トリガーは他のテーブルの列を参照できます。 たとえば、トリガーでは、別のテーブルのSELECT
を使用して、挿入または更新されたデータと比較したり、データの変更やユーザー定義エラー メッセージの表示などの他のアクションを実行したりできます。DML トリガーを使用して、データの変更前と変更後のテーブルの状態を評価し、その違いに基づいた操作を実行することもできます。
テーブル上の同じ型 (
INSERT
、UPDATE
、またはDELETE
) の複数の DML トリガーを使用すると、同じ変更ステートメントに応答して複数の異なるアクションを実行できます。制約でエラーを通知するには、標準化されたシステム エラー メッセージを使用する必要があります。 カスタマイズしたメッセージや複雑なエラー処理が必要な場合、またはこれらを使用する利点がある場合は、アプリケーションでは、トリガーを使用する必要があります。
DML トリガーでは、参照整合性に違反する変更を禁止またはロールバックできるため、試行されたデータ変更が取り消されます。 このようなトリガーは、外部キーを変更しても、新しい値がその主キーと一致しない場合に有効になる可能性があります。 ただし、
FOREIGN KEY
制約は通常、この目的で使用されます。トリガー テーブルに制約が存在する場合は、
INSTEAD OF
トリガーの実行後、AFTER
トリガーの実行前にチェックされます。 制約に違反した場合、INSTEAD OF
トリガー アクションはロールバックされ、AFTER
トリガーは実行されません。
DML トリガーの種類
AFTER トリガー
AFTER
トリガーは、 INSERT
、 UPDATE
、 MERGE
、または DELETE
ステートメントのアクションが実行された後に実行されます。 AFTER
制約違反が発生した場合、トリガーは実行されません。 したがって、これらのトリガーは、制約違反を妨げる可能性のある処理には使用できません。 MERGE
ステートメントで指定されたINSERT
、UPDATE
、またはDELETE
アクションごとに、対応するトリガーが DML 操作ごとに発生します。
INSTEAD OF トリガー
INSTEAD OF
トリガーは、トリガーステートメントの標準アクションをオーバーライドします。 そのため、1 つ以上の列に対してエラーまたは値のチェックを実行し、行または行を挿入、更新、または削除する前に他のアクションを実行するために使用できます。 たとえば、経理テーブル内の時給列の値を更新するときに、更新する値が指定された値を超えている場合は、エラー メッセージを生成してトランザクションをロールバックするようにトリガーを定義することができます。また、新しいレコードを経理テーブルに挿入する前に監査記録にそのレコードを挿入するようにトリガーを定義することもできます。 INSTEAD OF
トリガーの主な利点は、更新をサポートするために更新できないビューを有効にすることです。 たとえば、複数のベース テーブルに基づくビューでは、複数のテーブル内の参照データの挿入、更新、削除をサポートするために、 INSTEAD OF
トリガーを使用する必要があります。 INSTEAD OF
トリガーのもう 1 つの利点は、バッチの一部を拒否しながらバッチの他の部分を成功させるロジックをコーディングできることです。
次の表は、 AFTER
トリガーと INSTEAD OF
トリガーの機能を比較したものです。
Function | AFTER トリガー |
INSTEAD OF トリガー |
---|---|---|
適用範囲 | テーブル | テーブルとビュー |
テーブルまたはビューごとの数 | トリガー アクションごとに複数 (UPDATE 、 DELETE 、および INSERT ) |
トリガー アクション (UPDATE 、 DELETE 、 INSERT ) ごとに 1 つ |
連鎖参照 | 制限はありません。 | INSTEAD OF UPDATE および DELETE トリガーは、連鎖参照整合性制約の対象であるテーブルでは許可されません。 |
実行 | 後: 制約処理 宣言参照動作 inserted テーブルの作成とdeleted トリガーを起動する動作 |
次の処理の前: 制約処理 次の処理の代わり: トリガーを起動する動作 テーブル inserted とdeleted の作成後に |
実行の順序 | 最初と最後の実行が指定される場合があります | 該当なし |
inserted および deleted テーブルの varchar(max)、nvarchar(max)、および varbinary(max) 列参照 |
許可されます。 | 許可されます。 |
inserted テーブルとdeleted テーブル内の text、ntext、image 列の参照 |
使用できません | 許可されます。 |
CLR トリガー
共通言語ランタイム (CLR) トリガーには、 AFTER
トリガーまたは INSTEAD OF
トリガーのいずれかを指定できます。 CLR トリガーには、データ定義言語 (DDL) トリガーを指定することもできます。 CLR トリガーは、Transact-SQL ストアド プロシージャを実行するのではなく、.NET Framework で作成され、SQL Server にアップロードされたアセンブリのメンバーであるマネージド コードに記述されている、1 つ以上のメソッドを実行します。
関連タスク
タスク | [アーティクル] |
---|---|
DML トリガーの作成方法について説明します。 | DML トリガーを作成する |
CLR トリガーの作成方法について説明します。 | CLR トリガーを作成する |
単一行および複数行のデータ変更を処理する DML トリガーの作成方法について説明します。 | 複数行のデータを処理するための DML トリガーの作成 |
トリガーを入れ子にする方法について説明します。 | 入れ子になったトリガーの作成 |
AFTER トリガーを起動する順序を指定する方法について説明します。 |
最初と最後のトリガーの指定 |
トリガー コードの中で特殊な inserted テーブルおよび deleted テーブルを使用する方法について説明します。 | 挿入されたテーブルと削除されたテーブルを使用する |
DML トリガーに変更を加えたり名前を変更する方法について説明します。 | DML トリガーの変更または名前の変更 |
DML トリガーに関する情報を表示する方法について説明します。 | DML トリガーに関する情報の取得 |
DML トリガーを削除または無効化する方法について説明します。 | DML トリガーの削除または無効化 |
トリガーのセキュリティを管理する方法について説明します。 | トリガーのセキュリティを管理する |