DDL トリガの設計

更新 : 2006 年 12 月 12 日

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

  • DDL トリガのスコープを把握する必要があります。
  • トリガを起動する Transact-SQL ステートメントまたはステートメントのグループを決める必要があります。
ms186406.security(ja-jp,SQL.90).gifセキュリティ メモ :
上位の特権の下では、トリガ内の悪意のあるコードを実行できます。この脅威を緩和する方法の詳細については、「トリガのセキュリティの管理」を参照してください。

トリガのスコープについて

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;
GO

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

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

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

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

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

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

DDL トリガは、次のイベントに応答して起動されるように作成できます。

  • 1 つ以上の特定の DDL ステートメント
  • 事前に定義された DDL ステートメントのグループ

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

DDL トリガは、1 つ以上の特定の Transact-SQL ステートメントが実行された後に起動されるように設計できます。前述の例では、DROP TABLE イベントまたは ALTER TABLE イベントの後で、トリガ safety が起動されます。

すべての DDL イベントで DDL トリガを起動できるわけではありません。トランザクション処理されない非同期ステートメントのみに対応したイベントもいくつかあります。たとえば、ADD_ROLE_MEMBER イベントを使用して DDL トリガを起動することはできません。このようなイベントには、イベント通知を使用してください。イベント通知の詳細については、「イベント通知 (データベース エンジン)」を参照してください。

DDL トリガに使用される DDL イベント」には、DDL トリガを起動するために指定できる各 Transact-SQL ステートメント、および起動できるスコープが記載されています。

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

類似したイベントの事前定義済みのグループに所属する Transact-SQL イベントを実行した後に、DDL トリガを起動できます。たとえば、CREATE TABLE ステートメント、ALTER TABLE ステートメント、または DROP TABLE ステートメントのいずれかの実行後に DDL トリガを発生させる場合、CREATE TRIGGER ステートメントで FOR DDL_TABLE_EVENTS を指定できます。CREATE TRIGGER の実行後、イベント グループで対応されるイベントが sys.trigger_events カタログ ビューに追加されます。

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

参照

概念

EVENTDATA 関数の使用
DDL トリガについて
DDL トリガの実装

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

変更内容 :
  • CREATE_DATABASE イベントを使用して DDL トリガを起動することができないという誤った情報を修正しました。このイベントは、イベント通知の起動には使用できるが DDL トリガの起動には使用できないイベントの例である ADD_ROLE_MEMBER に置き換えました。

2006 年 7 月 17 日

変更内容 :
  • 「トリガのスコープについて」の 2 番目の例を更新しました。