次の方法で共有


DML トリガー

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

DML トリガーは、トリガーで定義されているテーブルまたはビューに影響を与えるデータ操作言語 (DML) イベントが発生したときに自動的に有効となる特殊なストアド プロシージャです。 DML イベントには、 INSERTUPDATE、または DELETE ステートメントが含まれます。 DML トリガーを使用して、ビジネス ルールやデータの整合性を強制的に適用したり、他のテーブルを照会したりできるほか、複雑な Transact-SQL ステートメントを使用することもできます。 トリガーとそのトリガーを起動するステートメントは単一のトランザクションとして扱われ、このトランザクションはトリガー内からロールバックできます。 ディスクの空き容量の不足などの重大なエラーが検出されると、このトランザクション全体が自動的にロールバックされます。

メリット

エンティティの整合性またはドメインの整合性を適用できるという点で、DML トリガーは制約に似ています。 一般に、エンティティの整合性は、 PRIMARY KEY 制約と UNIQUE 制約の一部であるインデックス、または制約とは別に作成されるインデックスによって、常に最低レベルで適用する必要があります。 ドメインの整合性は CHECK 制約を使用して適用し、参照整合性 (RI) は FOREIGN KEY 制約によって適用する必要があります。 DML トリガーは、制約によってサポートされる機能がアプリケーションの機能ニーズを満たさない場合に最も役立ちます。

以下に DML トリガーと制約を比較し、どのような場合に DML トリガーが制約よりも有利となるかを示します。

  • DML トリガーでは、データベースの関連テーブルを使用して変更を連鎖することができます。ただし、連鎖参照整合性制約を使用すると、これらの変更をより効率的に実行できます。 FOREIGN KEY 制約では、 REFERENCES 句でカスケード参照アクションが定義されていない限り、別の列の値と完全に一致する列値のみを検証できます。

  • 悪意のある操作や不適切な INSERTUPDATEDELETE 操作から保護し、 CHECK 制約で定義されている制限よりも複雑なその他の制限を適用できます。

    CHECK制約とは異なり、DML トリガーは他のテーブルの列を参照できます。 たとえば、トリガーでは、別のテーブルの SELECT を使用して、挿入または更新されたデータと比較したり、データの変更やユーザー定義エラー メッセージの表示などの他のアクションを実行したりできます。

  • DML トリガーを使用して、データの変更前と変更後のテーブルの状態を評価し、その違いに基づいた操作を実行することもできます。

  • テーブル上の同じ型 (INSERTUPDATE、または DELETE) の複数の DML トリガーを使用すると、同じ変更ステートメントに応答して複数の異なるアクションを実行できます。

  • 制約でエラーを通知するには、標準化されたシステム エラー メッセージを使用する必要があります。 カスタマイズしたメッセージや複雑なエラー処理が必要な場合、またはこれらを使用する利点がある場合は、アプリケーションでは、トリガーを使用する必要があります。

  • DML トリガーでは、参照整合性に違反する変更を禁止またはロールバックできるため、試行されたデータ変更が取り消されます。 このようなトリガーは、外部キーを変更しても、新しい値がその主キーと一致しない場合に有効になる可能性があります。 ただし、 FOREIGN KEY 制約は通常、この目的で使用されます。

  • トリガー テーブルに制約が存在する場合は、 INSTEAD OF トリガーの実行後、 AFTER トリガーの実行前にチェックされます。 制約に違反した場合、 INSTEAD OF トリガー アクションはロールバックされ、 AFTER トリガーは実行されません。

DML トリガーの種類

AFTER トリガー

AFTER トリガーは、 INSERTUPDATEMERGE、または DELETE ステートメントのアクションが実行された後に実行されます。 AFTER 制約違反が発生した場合、トリガーは実行されません。 したがって、これらのトリガーは、制約違反を妨げる可能性のある処理には使用できません。 MERGE ステートメントで指定されたINSERTUPDATE、またはDELETEアクションごとに、対応するトリガーが DML 操作ごとに発生します。

INSTEAD OF トリガー

INSTEAD OF トリガーは、トリガーステートメントの標準アクションをオーバーライドします。 そのため、1 つ以上の列に対してエラーまたは値のチェックを実行し、行または行を挿入、更新、または削除する前に他のアクションを実行するために使用できます。 たとえば、経理テーブル内の時給列の値を更新するときに、更新する値が指定された値を超えている場合は、エラー メッセージを生成してトランザクションをロールバックするようにトリガーを定義することができます。また、新しいレコードを経理テーブルに挿入する前に監査記録にそのレコードを挿入するようにトリガーを定義することもできます。 INSTEAD OF トリガーの主な利点は、更新をサポートするために更新できないビューを有効にすることです。 たとえば、複数のベース テーブルに基づくビューでは、複数のテーブル内の参照データの挿入、更新、削除をサポートするために、 INSTEAD OF トリガーを使用する必要があります。 INSTEAD OFトリガーのもう 1 つの利点は、バッチの一部を拒否しながらバッチの他の部分を成功させるロジックをコーディングできることです。

次の表は、 AFTER トリガーと INSTEAD OF トリガーの機能を比較したものです。

Function AFTER トリガー INSTEAD OF トリガー
適用範囲 テーブル テーブルとビュー
テーブルまたはビューごとの数 トリガー アクションごとに複数 (UPDATEDELETE、および INSERT) トリガー アクション (UPDATEDELETEINSERT) ごとに 1 つ
連鎖参照 制限はありません。 INSTEAD OF UPDATE および DELETE トリガーは、連鎖参照整合性制約の対象であるテーブルでは許可されません。
実行 後:

制約処理

宣言参照動作

insertedテーブルの作成とdeleted

トリガーを起動する動作
次の処理の前: 制約処理

次の処理の代わり: トリガーを起動する動作

テーブルinserteddeletedの作成後に
実行の順序 最初と最後の実行が指定される場合があります 該当なし
inserted および deleted テーブルの varchar(max)nvarchar(max)、および varbinary(max) 列参照 許可されます。 許可されます。
insertedテーブルとdeleted テーブル内の textntextimage 列の参照 使用できません 許可されます。

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 トリガーの削除または無効化
トリガーのセキュリティを管理する方法について説明します。 トリガーのセキュリティを管理する