DDL トリガー

DDL トリガーは、さまざまなデータ定義言語 (DDL) イベントに対応して起動されます。 これらのイベントは主に、キーワード CREATE、ALTER、DROP、GRANT、DENY、REVOKE、または UPDATE STATISTICS で始まる Transact-SQL ステートメントに対応します。 DDL と同様の操作を実行する特定のシステム ストアド プロシージャも DDL トリガーを起動できます。

DDL トリガーは、次のような場合に使用します。

  • データベース スキーマへの特定の変更を回避する。

  • データベース スキーマの変更に対して、データベース内でなんらかの処理を実行する。

  • データベース スキーマの変更またはイベントを記録する。

重要

DDL トリガーはテストして、実行されているシステム ストアド プロシージャに応答するかどうか、確認してください。 たとえば、CREATE TYPE ステートメントおよび sp_addtype ストアド プロシージャはどちらも、CREATE_TYPE イベントで作成される DDL トリガーを起動します。

DDL トリガーの種類

Transact-SQL DDL トリガー
サーバー スコープまたはデータベース スコープのイベントに応答して 1 つ以上の Transact-SQL ステートメントを実行する特殊な種類の Transact-SQL ストアド プロシージャ。 たとえば、ALTER SERVER CONFIGURATION などのステートメントが実行されたときや、DROP TABLE を使用してテーブルが削除されたときに、DDL トリガーを起動させることができます。

CLR DDL トリガー
CLR トリガーは、Transact-SQL ストアド プロシージャを実行する代わりに、.NET Frameworkで作成され、SQL Serverにアップロードされたアセンブリのメンバーであるマネージド コードで記述された 1 つ以上のメソッドを実行します。

DDL トリガーは、起動元の DDL ステートメントが実行されるまで、起動されません。 DDL トリガーを INSTEAD OF トリガーの代わりに使用することはできません。 DDL トリガーは、ローカルまたはグローバルの一時テーブルおよびストアド プロシージャに影響するイベントに応答して起動されることはありません。

DDL トリガーでは、特殊な inserted テーブルや deleted テーブルは作成されません。

DDL トリガーを起動するイベントの情報と、起動したトリガーにより加えられる変更は、EVENTDATA 関数を使用してキャプチャします。

DDL イベントごとに作成される複数のトリガー。

DML トリガーと異なり、DDL トリガーのスコープはスキーマに設定されません。 このため、DDL トリガーに関するメタデータのクエリに、OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY、OBJECTPROPERTYEX などの関数を使用することはできません。 代わりに、カタログ ビューを使用してください。

サーバー スコープの DDL トリガーは、SQL Server Management Studio のオブジェクト エクスプローラーの [Triggers] フォルダーに表示されます。 このフォルダーは、 [Server Objects] フォルダーにあります。 データベース スコープの DDL トリガーは、 [データベース トリガー] フォルダーに表示されます。 このフォルダーは対応するデータベースの [Programmability] フォルダーにあります。

重要

上位の特権の下では、トリガー内の悪意のあるコードを実行できます。 この脅威の軽減方法の詳細については、「 トリガーのセキュリティの管理」を参照してください。

DDL トリガーのスコープ

DDL トリガーは、現在のデータベースまたは現在のサーバーで処理された Transact-SQL イベントに応答して発生する可能性があります。 トリガーのスコープは、イベントによって異なります。 たとえば、CREATE_TABLE イベントに応答して起動されるように作成された DDL トリガーは、データベース、またはサーバー インスタンスで CREATE_TABLE イベントが発生するたびに起動されます。 CREATE_LOGIN イベントに応答して起動されるように作成された DDL トリガーは、サーバー インスタンスで CREATE_LOGIN イベントが発生した場合にのみ起動できます。

次の例では、データベースで safety イベントまたは DROP_TABLE イベントが発生するたびに、DDL トリガー ALTER_TABLE が起動されます。

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_TABLE, ALTER_TABLE   
AS   
   PRINT 'You must disable Trigger "safety" to drop or alter tables!'   
   ROLLBACK;  

次の例では、現在のサーバー インスタンスで CREATE_DATABASE イベントが発生した場合に、DDL トリガーによってメッセージが出力されます。 この例では、 関数を EVENTDATA 使用して、対応する Transact-SQL ステートメントのテキストを取得します。 DDL トリガーで EVENTDATA を使用する方法の詳細については、「 EVENTDATA 関数の使用」を参照してください。

IF EXISTS (SELECT * FROM sys.server_triggers  
    WHERE name = 'ddl_trig_database')  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  
CREATE TRIGGER ddl_trig_database   
ON ALL SERVER   
FOR CREATE_DATABASE   
AS   
    PRINT 'Database Created.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
GO  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  
  

Transact-SQL ステートメントを指定できるスコープにマップする一覧は、このトピックの後半の「特定の DDL ステートメントを選択して DDL トリガーを起動する」セクションに記載されているリンクから入手できます。

データベース スコープが設定された DDL トリガーは、DDL トリガーが作成されたデータベースにオブジェクトとして格納されます。 DDL トリガーを master データベースに作成することもでき、ユーザーが設計したデータベースで作成されたトリガーと同様に動作します。 sys.triggers カタログ ビューにクエリを実行することで、DDL トリガーに関する情報を取得できます。 トリガーが作成されたデータベース コンテキスト内の sys.triggers に対してクエリを実行できます。または、識別子 (たとえば、 master.sys.triggers) としてデータベース名を指定することもできます。

サーバー スコープが設定された DDL トリガーは、 master データベースにオブジェクトとして格納されます。 ただし、サーバー スコープが設定された DDL トリガーに関する情報は、任意のデータベース コンテキストの sys.server_triggers カタログ ビューから取得できます。

Transact-SQL ステートメントまたはステートメントのグループの指定

DDL トリガーを起動するための、特定の DDL ステートメントの選択

DDL トリガーは、1 つ以上の特定の Transact-SQL ステートメントが実行された後に起動するように設計できます。 前の例では、 safety イベント、または DROP_TABLE イベントの後に ALTER_TABLE トリガーが起動されます。 DDL トリガーを起動するように指定できる Transact-SQL ステートメントの一覧と、トリガーを起動できるスコープについては、「 DDL イベント」を参照してください。

DDL トリガーを起動するための、事前定義済み DDL ステートメントのグループの選択

DDL トリガーは、類似イベントの定義済みのグループに属する Transact-SQL イベントの実行後に発生する可能性があります。 たとえば、CREATE TABLE ステートメント、ALTER TABLE ステートメント、または DROP TABLE ステートメントのいずれかの実行後に DDL トリガーを発生させる場合、CREATE TRIGGER ステートメントで FOR DDL_TABLE_EVENTS を指定できます。 CREATE TRIGGER の実行後、イベント グループで対応されるイベントが sys.trigger_events カタログ ビューに追加されます。

SQL Server 2005 では、イベント グループにトリガーが作成された場合、sys.trigger_eventsにはイベント グループに関する情報は含まれません。sys.trigger_eventsには、そのグループの対象となる個々のイベントに関する情報のみが含まれます。 SQL Server 2008 以降では、 sys.trigger_events が、トリガーが作成されたイベント グループに関するメタデータ、およびイベント グループが対応する個々のイベントに関するメタデータも保持します。 したがって、SQL Server 2008 以降のイベント グループの対象となるイベントに対する変更は、SQL Server 2005 でこれらのイベント グループに対して作成された DDL トリガーには適用されません。

DDL トリガーで使用できる事前定義済みの DDL ステートメントのグループ、そのグループが対応する特定のステートメント、およびこれらのイベント グループをプログラミングできるスコープの一覧については、「 DDL イベント グループ」を参照してください。

タスク トピック
DDL トリガーを作成、変更、削除、または無効化する方法について説明します。 DDL トリガーの実装
CLR DDL トリガーの作成方法について説明します。 CLR トリガーの作成
DDL トリガーに関する情報を取得する方法について説明します。 DDL トリガーに関する情報の取得
DDL トリガーを起動するイベントの情報を、EVENTDATA 関数を使用して取得する方法について説明します。 EVENTDATA 関数の使用
トリガーのセキュリティを管理する方法について説明します。 トリガーのセキュリティの管理

参照

DML トリガー
ログオン トリガー
CREATE TRIGGER (Transact-SQL)