DDL トリガー

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

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 トリガー

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

CLR DDL トリガー

CLR トリガーは、Transact-SQL ストアド プロシージャを実行するのではなく、.NET Framework で作成され、Transact-SQL でアップロードされたアセンブリのメンバーであるマネージド コードに記述されている、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 トリガーによってメッセージが出力されます。 この例では、対応する Transact-SQL ステートメントのテキストを取得するために EVENTDATA 関数を使用します。 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 ステートメントに指定できるスコープをその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 イベントを実行した後に、DDL トリガーを起動できます。 たとえば、CREATE TABLE ステートメント、ALTER TABLE ステートメント、または DROP TABLE ステートメントのいずれかの実行後に DDL トリガーを発生させる場合、CREATE TRIGGER ステートメントで FOR DDL_TABLE_EVENTS を指定できます。 CREATE TRIGGER の実行後、イベント グループで対応されるイベントが sys.trigger_events カタログ ビューに追加されます。

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

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

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

参照

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