DDL トリガと DML トリガについて
DDL トリガと DML トリガでは用途が異なります。
DML トリガは、INSERT、UPDATE、および DELETE ステートメントを操作し、ビジネス ルールを適用したり、テーブルやビューでデータが変更された場合にデータ整合性を拡張するために使用します。
DDL トリガは、CREATE、ALTER、DROP、その他の DDL ステートメント、および DDL に類似した処理を実行するシステム ストアド プロシージャを操作します。DDL トリガを使用して、管理タスクを実行したり、データベースに影響を与えるビジネス ルールを適用します。DDL トリガは、1 つのデータベースやサーバー全体にわたり、特定の種類のすべてのコマンドに適用されます。
DML トリガと DDL トリガの作成、変更、または削除には、類似した Transact-SQL 構文を使用します。また、これらの 2 つのトリガの動作には他の類似点もあります。
DML トリガと同様に、DDL トリガを使用して、Microsoft.NET Framework で作成され、SQL Server にアップロードされた、アセンブリとしてパッケージ化されたマネージ コードを実行できます。詳細については、「CLR トリガのプログラミング」を参照してください。
DML トリガと同様に、複数の DDL トリガを 1 つの Transact-SQL ステートメントで作成できます。また、DDL トリガとこのトリガを起動するステートメントは、同じトランザクション内で実行されます。このトランザクションは、DDL トリガ内からロールバックできます。重大なエラーが発生した場合には、トランザクション全体が自動的にロールバックされることがあります。バッチから実行している DDL トリガに ROLLBACK TRANSACTION ステートメントが明示的に含まれていると、バッチ全体がキャンセルされます。詳細については、「COMMIT TRANSACTION または ROLLBACK TRANSACTION を含む DML トリガの使用」を参照してください。
注意 |
---|
DDL トリガの本文内で行われた ALTER DATABASE イベントはロールバックできません。 |
DML トリガと同様に、DDL トリガは入れ子にできます。詳細については、「入れ子になったトリガの使用」を参照してください。
DDL トリガをデザインする場合は、次に示す DML トリガとの相違点を考慮してください。
DDL トリガは、Transact-SQL ステートメントが完了するまで実行されません。DDL トリガを INSTEAD OF トリガの代わりに使用することはできません。
DDL トリガでは、inserted テーブルや deleted テーブルは作成できません。DDL トリガを起動するイベントの情報と、起動したトリガにより加えられる変更は、EVENTDATA 関数を使用してキャプチャします。詳細については、「EVENTDATA 関数の使用」を参照してください。