次の方法で共有


DDL トリガー

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

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

次のタスクを実行する場合は、DDL トリガーを使用します。

  • データベース スキーマへの特定の変更を回避する。
  • データベース スキーマの変更に対して、データベース内でなんらかの処理を実行する。
  • データベース スキーマの変更またはイベントを記録する。

重要

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

DDL トリガーの種類

Transact-SQL トリガー

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

CLR トリガー

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

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

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

DDL トリガーを起動するイベントと、トリガーによって引き起こされる後続の変更に関する情報は、 EVENTDATA 関数を使用してキャプチャされます。

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

データ操作言語 (DML) トリガーとは異なり、DDL トリガーのスコープはスキーマではありません。 そのため、OBJECTPROPERTYOBJECT_NAMEOBJECTPROPERTYOBJECTPROPERTYEXなどの関数は、DDL トリガーに関するメタデータのクエリには使用できません。 代わりに、カタログ ビューを使用してください。

サーバー スコープの DDL トリガーは、SQL Server Management Studio Object Explorer の [トリガー] フォルダーに表示されます。 このフォルダーは、 [Server Objects] フォルダーにあります。 データベース スコープの DDL トリガーは、 [データベース トリガー] フォルダーに表示されます。 このフォルダーは対応するデータベースの [Programmability] フォルダーにあります。

重要

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

DDL トリガーのスコープ

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

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

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;

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

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

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

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

特定の DDL ステートメントを選択して DDL トリガーを起動する

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

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

類似したイベントの事前定義済みのグループに所属する Transact-SQL イベントを実行した後に、DDL トリガーを起動できます。 たとえば、任意のCREATE TABLEALTER 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 には、そのグループの対象となる個々のイベントに関する情報のみが含まれます。 sys.trigger_events は、トリガーが作成されるイベント グループに関するメタデータと、イベント グループがカバーする個々のイベントに関するメタデータを保持します。 そのため、イベント グループの対象となるイベントに対する変更は、SQL Server 2005 (9.x) のこれらのイベント グループに対して作成された最新バージョンの SQL Server の DDL トリガーには適用されません。

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

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