DML トリガーDML Triggers

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

DML トリガーとは、そこに定義されているテーブルまたはビューに影響するようなデータ操作言語 (DML) イベントが発生すると自動的に実行される特殊なストアド プロシージャです。DML triggers is a special type of stored procedure that automatically takes effect when a data manipulation language (DML) event takes place that affects the table or view defined in the trigger. DML イベントには、INSERT、UPDATE、または DELETE のステートメントが含まれます。DML events include INSERT, UPDATE, or DELETE statements. DML トリガーを使用して、ビジネス ルールやデータの整合性を強制的に適用したり、他のテーブルを照会したりできるほか、複雑な Transact-SQLTransact-SQL ステートメントを使用することもできます。DML triggers can be used to enforce business rules and data integrity, query other tables, and include complex Transact-SQLTransact-SQL statements. トリガーとそのトリガーを起動するステートメントは単一のトランザクションとして扱われ、このトランザクションはトリガー内からロールバックできます。The trigger and the statement that fires it are treated as a single transaction, which can be rolled back from within the trigger. ディスクの空き容量の不足などの重大なエラーが検出されると、このトランザクション全体が自動的にロールバックされます。If a severe error is detected (for example, insufficient disk space), the entire transaction automatically rolls back.

DML トリガーの利点DML Trigger Benefits

エンティティの整合性またはドメインの整合性を適用できるという点で、DML トリガーは制約に似ています。DML triggers are similar to constraints in that they can enforce entity integrity or domain integrity. 一般に、PRIMARY KEY 制約と UNIQUE 制約の一部であるインデックス、またはこれらの制約とは無関係に作成されたインデックスの最下位レベルで、エンティティの整合性を常に確保する必要があります。In general, entity integrity should always be enforced at the lowest level by indexes that are part of PRIMARY KEY and UNIQUE constraints or are created independently of constraints. ドメインの整合性の確保には CHECK 制約を使用し、参照整合性 (RI) の確保には FOREIGN KEY 制約を使用する必要があります。Domain integrity should be enforced through CHECK constraints, and referential integrity (RI) should be enforced through FOREIGN KEY constraints. DML トリガーは、制約でサポートされている機能がアプリケーションの機能要件を満たすことができない場合に最も役立ちます。DML triggers are most useful when the features supported by constraints cannot meet the functional needs of the application.

以下に DML トリガーと制約を比較し、どのような場合に DML トリガーが有利となるかを示します。The following list compares DML triggers with constraints and identifies when DML triggers have benefits over .

  • DML トリガーでは、データベースの関連テーブルを使用して変更を連鎖することができます。ただし、連鎖参照整合性制約を使用すると、これらの変更をより効率的に実行できます。DML triggers can cascade changes through related tables in the database; however, these changes can be executed more efficiently using cascading referential integrity constraints. REFERENCES 句によって連鎖参照動作が定義されていない場合、FOREIGN KEY 制約で検証できるのは、ある列の値が別の列の値と完全に一致しているかどうかだけです。FOREIGN KEY constraints can validate a column value only with an exact match to a value in another column, unless the REFERENCES clause defines a cascading referential action.

  • DML トリガーを使用すると、不適切あるいは悪意のある INSERT、UPDATE、および DELETE 操作から保護できます。また、CHECK 制約を使用して定義された制約よりも複雑な制約を適用することができます。They can guard against malicious or incorrect INSERT, UPDATE, and DELETE operations and enforce other restrictions that are more complex than those defined with CHECK constraints.

    CHECK 制約とは異なり、DML トリガーでは、他のテーブルの列を参照できます。Unlike CHECK constraints, DML triggers can reference columns in other tables. たとえば、トリガーでは、他のテーブルに対して SELECT ステートメントを使用して、挿入または更新されたデータと比較したり、データの変更やユーザー定義のエラーメッセージの表示などの追加処理を実行することができます。For example, a trigger can use a SELECT from another table to compare to the inserted or updated data and to perform additional actions, such as modify the data or display a user-defined error message.

  • DML トリガーを使用して、データの変更前と変更後のテーブルの状態を評価し、その違いに基づいた操作を実行することもできます。They can evaluate the state of a table before and after a data modification and take actions based on that difference.

  • 1 つのテーブルに同じ種類 (INSERT、UPDATE、または DELETE) の DML トリガーを複数作成すると、1 つの変更ステートメントに対して複数の異なる操作を実行できます。Multiple DML triggers of the same type (INSERT, UPDATE, or DELETE) on a table allow multiple, different actions to take place in response to the same modification statement.

  • 制約でエラーを通知するには、標準化されたシステム エラー メッセージを使用する必要があります。Constraints can communicate about errors only through standardized system error messages. カスタマイズしたメッセージや複雑なエラー処理が必要な場合、またはこれらを使用する利点がある場合は、アプリケーションでは、トリガーを使用する必要があります。If your application requires, or can benefit from, customized messages and more complex error handling, you must use a trigger.

  • DML トリガーでは参照整合性に反する変更を禁止してロールバックすることができるので、実行されたデータ変更を取り消すことができます。DML triggers can disallow or roll back changes that violate referential integrity, thereby canceling the attempted data modification. このようなトリガーは、外部キーを変更したときに、新しい値がその主キーに一致しない場合に実行されます。Such a trigger might go into effect when you change a foreign key and the new value does not match its primary key. ただし、通常、この目的には FOREIGN KEY 制約を使用します。However, FOREIGN KEY constraints are usually used for this purpose.

  • トリガー テーブルに制約が存在する場合、これらの制約は、INSTEAD OF トリガーが実行されてから、AFTER トリガーが実行されるまでの間にチェックされます。If constraints exist on the trigger table, they are checked after the INSTEAD OF trigger execution but prior to the AFTER trigger execution. 制約違反の場合は、INSTEAD OF トリガー動作がロールバックされ、AFTER トリガーは実行されません。If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger is not executed.

DML トリガーの種類Types of DML Triggers

AFTER トリガーAFTER trigger
AFTER トリガーは、INSERT、UPDATE、MERGE、または DELETE ステートメントの動作が実行された後に実行されます。AFTER triggers are executed after the action of the INSERT, UPDATE, MERGE, or DELETE statement is performed. 制約違反が発生した場合は、AFTER トリガーは実行されません。したがってこのトリガーは、制約違反を防ぐための処理には使用できません。AFTER triggers are never executed if a constraint violation occurs; therefore, these triggers cannot be used for any processing that might prevent constraint violations. MERGE ステートメントで指定されたすべての INSERT、UPDATE、または DELETE 操作について、対応するトリガーが各 DML 操作に対して実行されます。For every INSERT, UPDATE, or DELETE action specified in a MERGE statement, the corresponding trigger is fired for each DML operation.

INSTEAD OF トリガーINSTEAD OF trigger
INSTEAD OF トリガーは、トリガーを起動するステートメントの標準動作をオーバーライドする働きをします。INSTEAD OF triggers override the standard actions of the triggering statement. たとえば、このトリガーを使用して、1 つ以上の列に対するエラー チェックや値チェックを実行することができます。行の挿入、更新、削除などの操作の前に追加の処理を実行することが可能です。Therefore, they can be used to perform error or value checking on one or more columns and the perform additional actions before insert, updating or deleting the row or rows. たとえば、経理テーブル内の時給列の値を更新するときに、更新する値が指定された値を超えている場合は、エラー メッセージを生成してトランザクションをロールバックするようにトリガーを定義することができます。また、新しいレコードを経理テーブルに挿入する前に監査記録にそのレコードを挿入するようにトリガーを定義することもできます。For example, when the value being updated in an hourly wage column in a payroll table exceeds a specified value, a trigger can be defined to either produce an error message and roll back the transaction, or insert a new record into an audit trail before inserting the record into the payroll table. INSTEAD OF トリガーを使用する主な利点は、更新可能ではなかったビューを更新できるようになることです。The primary advantage of INSTEAD OF triggers is that they enable views that would not be updatable to support updates. たとえば、複数のベース テーブルに基づいたビューでは、INSTEAD OF トリガーを使用して、複数のテーブルのデータを参照する挿入、更新、および削除の各操作をサポートする必要があります。For example, a view based on multiple base tables must use an INSTEAD OF trigger to support inserts, updates, and deletes that reference data in more than one table. INSTEAD OF トリガーのもう 1 つの利点は、バッチの一部を拒否しながらバッチのその他の部分を正常に実行できるロジックをコード化できることです。Another advantage of INSTEAD OF triggers is that they enable you to code logic that can reject parts of a batch while letting other parts of a batch to succeed.

次の表は、AFTER トリガーと INSTEAD OF トリガーの機能を比較したものです。This table compares the functionality of the AFTER and INSTEAD OF triggers.

機能Function AFTER トリガーAFTER trigger INSTEAD OF トリガーINSTEAD OF trigger
適用範囲Applicability テーブルTables テーブルとビューTables and views
テーブルまたはビューごとの数Quantity per table or view トリガーを起動する動作 (UPDATE、DELETE、および INSERT) ごとに複数指定できます。Multiple per triggering action (UPDATE, DELETE, and INSERT) トリガーを起動する動作 (UPDATE、DELETE、および INSERT) ごとに 1 つしか指定できません。One per triggering action (UPDATE, DELETE, and INSERT)
連鎖参照Cascading references 制限はありません。No restrictions apply INSTEAD OF UPDATE トリガーと DELETE トリガーは、参照整合性制約の連鎖の対象となっているテーブルでは許可されません。INSTEAD OF UPDATE and DELETE triggers are not allowed on tables that are targets of cascaded referential integrity constraints.
実行Execution 次の処理の後After:

制約処理Constraint processing

宣言参照動作Declarative referential actions

inserted テーブルと deleted テーブルの作成inserted and deleted tables creation

トリガーを起動する動作The triggering action
次の処理の前制約処理Before: Constraint processing

次の処理の代わり: トリガーを起動する動作In place of: The triggering action

次の処理の後: inserted テーブルと deleted テーブルの作成After: inserted and deleted tables creation
実行の順序Order of execution 最初と最後の実行内容を指定できます。First and last execution may be specified 適用なしNot applicable
insertedテーブルと deletedテーブル内の varchar(max)nvarchar(max) 、および varbinary(max) の列参照varchar(max), nvarchar(max), and varbinary(max) column references in inserted and deleted tables AllowedAllowed AllowedAllowed
insertedテーブルと deletedテーブル内の textntext 、および image の列参照text, ntext, and image column references in inserted and deleted tables 使用不可Not allowed AllowedAllowed

CLR トリガーCLR Triggers
CLR トリガーは、AFTER トリガーと INSTEAD OF トリガーのいずれかにすることができます。A CLR Trigger can be either an AFTER or INSTEAD OF trigger. また、CLR トリガーは DDL トリガーにすることもできます。A CLR trigger can also be a DDL trigger. CLR トリガーは、 Transact-SQLTransact-SQL ストアド プロシージャを実行するのではなく、.NET Framework で作成され、 SQL ServerSQL Serverでアップロードされたアセンブリのメンバーであるマネージド コードに記述されている、1 つ以上のメソッドを実行します。Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

タスクTask トピックTopic
DML トリガーの作成方法について説明します。Describes how to create a DML trigger. DML トリガーの作成Create DML Triggers
CLR トリガーの作成方法について説明します。Describes how to create a CLR trigger. CLR トリガーの作成Create CLR Triggers
単一行および複数行のデータ変更を処理する DML トリガーの作成方法について説明します。Describes how to create a DML trigger to handle both single-row and multi-row data modifications. 複数行のデータを処理するための DML トリガーの作成Create DML Triggers to Handle Multiple Rows of Data
トリガーを入れ子にする方法について説明します。Describes how to nest triggers. 入れ子になったトリガーの作成Create Nested Triggers
AFTER トリガーの起動順序を指定する方法について説明します。Describes how to specify the order in which AFTER triggers are fired. 最初と最後のトリガーの指定Specify First and Last Triggers
トリガー コードの中で特殊な inserted テーブルおよび deleted テーブルを使用する方法について説明します。Describes how to use the special inserted and delete tables in trigger code. inserted テーブルと deleted テーブルの使用Use the inserted and deleted Tables
DML トリガーに変更を加えたり名前を変更する方法について説明します。Describes how to modify or rename a DML trigger. DML トリガーの変更または名前の変更Modify or Rename DML Triggers
DML トリガーに関する情報を表示する方法について説明します。Describes how to view information about DML triggers. DML トリガーに関する情報の取得Get Information About DML Triggers
DML トリガーを削除または無効化する方法について説明します。Describes how to delete or disable DML triggers. DML トリガーの削除または無効化Delete or Disable DML Triggers
トリガーのセキュリティを管理する方法について説明します。Describes how to manage trigger security. トリガーのセキュリティの管理Manage Trigger Security

参照See Also

CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
トリガー関数 (Transact-SQL)Trigger Functions (Transact-SQL)