適用対象:SQL Server
Azure SQL Database
Azure 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 トリガー
サーバー スコープまたはデータベース スコープのイベントに応答して 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 トリガーのスコープはスキーマではありません。 そのため、OBJECTPROPERTY
、OBJECT_NAME
、OBJECTPROPERTY
、OBJECTPROPERTYEX
などの関数は、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 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
には、そのグループの対象となる個々のイベントに関する情報のみが含まれます。 sys.trigger_events
は、トリガーが作成されるイベント グループに関するメタデータと、イベント グループがカバーする個々のイベントに関するメタデータを保持します。 そのため、イベント グループの対象となるイベントに対する変更は、SQL Server 2005 (9.x) のこれらのイベント グループに対して作成された最新バージョンの SQL Server の DDL トリガーには適用されません。
DDL トリガーで使用できる事前定義済みの DDL ステートメントのグループ、そのグループが対応する特定のステートメント、およびこれらのイベント グループをプログラミングできるスコープの一覧については、「 DDL イベント グループ」を参照してください。
関連タスク
タスク | [アーティクル] |
---|---|
DDL トリガーを作成、変更、削除、または無効にする方法について説明します。 | DDL トリガーの実装 |
CLR DDL トリガーの作成方法について説明します。 | CLR トリガーを作成する |
DDL トリガーに関する情報を取得する方法について説明します。 | DDL トリガーに関する情報の取得 |
EVENTDATA 関数を使用して DDL トリガーを起動するイベントに関する情報を返す方法について説明します。 |
EVENTDATA 関数の使用 |
トリガーのセキュリティを管理する方法について説明します。 | トリガーのセキュリティを管理する |