DDL トリガの設計

DDL トリガを設計する前に、次の事項を行う必要があります。

  • DDL トリガのスコープを確認しておきます。

  • トリガを起動する Transact-SQL ステートメントまたはステートメントのグループを決定します。

セキュリティに関する注意セキュリティに関する注意

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

注意

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 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 ステートメントに指定できるスコープをそのステートメントに対応付けた一覧については、「DDL トリガを起動するための、特定の DDL ステートメントの選択」に記載されたリンクを参照してください。

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

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

DDL トリガのメタデータの取得方法の詳細については、「DDL トリガーに関する情報の取得」を参照してください。

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

DDL トリガは、1 つ以上の特定の DDL ステートメント、または事前に定義された DDL ステートメントのグループに応答して起動されるように作成できます。

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

DDL トリガは、1 つ以上の特定の Transact-SQL ステートメントが実行された後に起動されるように設計できます。前の例では、DROP_TABLE イベント、または ALTER_TABLE イベントの後に safety トリガが起動されます。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 で、イベント グループに対してトリガを作成した場合、sys.trigger_events にはイベント グループについての情報が含まれず、sys.trigger_events にはそのグループで対応される個々のイベントについての情報のみが含まれています。SQL Server 2008 では、sys.trigger_events が、トリガが作成されたイベント グループに関するメタデータ、およびイベント グループが対応する個々のイベントに関するメタデータも保持します。したがって、SQL Server 2008 のイベント グループで対応されたイベントに変更を加えても、SQL Server 2005 のイベント グループに対して作成された DDL トリガには適用されません。

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