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 イベント グループ」を参照してください。
Related Tasks
タスク | トピック |
---|---|
DDL トリガーを作成、変更、削除、または無効化する方法について説明します。 | DDL トリガーの実装 |
CLR DDL トリガーの作成方法について説明します。 | CLR トリガーの作成 |
DDL トリガーに関する情報を取得する方法について説明します。 | DDL トリガーに関する情報の取得 |
DDL トリガーを起動するイベントの情報を、EVENTDATA 関数を使用して取得する方法について説明します。 | EVENTDATA 関数の使用 |
トリガーのセキュリティを管理する方法について説明します。 | トリガーのセキュリティの管理 |