イベント通知のデザイン

イベント通知をデザインするには、次の項目を特定する必要があります。

  • 通知スコープ。

  • イベント通知を発生させる Transact-SQL ステートメントまたはステートメントのグループ。

注意

イベント通知は、ローカルまたはグローバルの一時テーブル、およびストアド プロシージャに影響するイベントへの応答として発生することはありません。

通知スコープの定義

イベント通知は、現在のデータベース内のすべてのオブジェクトまたは SQL Server の 1 つのインスタンスにあるすべてのオブジェクトで作成されたステートメントに応答して発生させるように指定できます。QUEUE_ACTIVATION イベントと BROKER_QUEUE_DISABLED イベントで指定されたイベント通知は、個別のキューにスコープが設定されます。すべてのイベントを任意のスコープで発生させることができるわけではありません。たとえば、CREATE_DATABASE イベントはサーバー インスタンス レベルでのみ発生させることができます。逆に、ALTER_TABLE イベントで作成されるイベント通知は、データベース内のすべてのテーブルまたはサーバー インスタンスのすべてのテーブルで発生するようにプログラミングできます。

次の例では、サーバー インスタンスで実行される任意の ALTER TABLE ステートメントの通知を現在のデータベースの Service Broker インスタンスに送信します。

CREATE EVENT NOTIFICATION log_ddl1 
   ON SERVER 
   FOR ALTER_TABLE 
   TO SERVICE '//Adventure-Works.com/ArchiveService' , 'current database';

CREATE EVENT NOTIFICATION log_ddl1 
   ON SERVER 
   FOR ALTER_TABLE 
   TO SERVICE '//Adventure-Works.com/ArchiveService' , 'current database';

Transact-SQL ステートメントと、そのステートメントに指定できるスコープへのリンクについては、後述の「イベント通知を発生させる特定の DDL ステートメントの選択」で説明します。

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

イベント通知は、次の項目に応答して発生するように作成できます。

  • 特定の DDL ステートメント、SQL トレース イベント、または Service Broker イベント

  • DDL ステートメントまたは SQL トレース イベントの定義済みグループ

イベント通知を発生させる特定の DDL ステートメントの選択

イベント通知は、特定の Transact-SQL ステートメントまたはストアド プロシージャの実行後に発生するように設計できます。上記の例で示したように、イベント通知は ALTER_TABLE イベントの後に発生します。

イベント通知を発生させることができる個々の Transact-SQL ステートメントおよび通知を実行できるスコープの一覧は、「DDL イベント」を参照してください。また、これらのイベントは、sys.event_notification_event_types カタログ ビューにクエリを実行することでも取得できます。

注意

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

イベント通知を発生させる特定の SQL トレース イベントの選択

イベント通知は、SQL Trace イベントの発生後に実行されるようにデザインできます。たとえば、次のイベント通知はサーバーでの Object_Created イベントの後に発生します。

CREATE EVENT NOTIFICATION log_ddl1 
   ON SERVER 
   FOR Object_Created 
   TO SERVICE '//Adventure-Works.com/ArchiveService', 'current database' ;

CREATE EVENT NOTIFICATION log_ddl1 
   ON SERVER 
   FOR Object_Created 
   TO SERVICE '//Adventure-Works.com/ArchiveService', 'current database' ;

イベント通知を発生させることができる SQL トレース イベントの一覧については、「イベント通知で使用するトレース イベント」を参照してください。また、これらのイベントの一覧は、sys.event_notification_event_types カタログ ビューにクエリを実行することでも取得できます。SQL トレース イベントは、サーバー インスタンスのスコープでのみ実行できます。SQL トレース イベント クラスの詳細については、「SQL Server Profiler のリファレンス」を参照してください。

イベント通知を発生させる Service Broker イベントの選択

イベント通知は、Service Broker イベントである QUEUE_ACTIVATION または BROKER_QUEUE_DISABLED の後に発生するようにデザインできます。QUEUE_ACTIVATION イベントは、キューに処理するメッセージが登録されたときに発生します。詳細については、「イベントベースのアクティブ化」を参照してください。BROKER_QUEUE_DISABLED イベントは、キューの状態が OFF に設定されたときに発生します。詳細については、「有害なメッセージの処理」を参照してください。

イベント通知を発生させる DDL ステートメントの定義済みグループの選択

イベント通知は、同様のイベントの定義済みグループに属する任意の Transact-SQL イベントの実行後に発生させることができます。たとえば、任意の CREATE TABLE ステートメント、ALTER TABLE ステートメント、または DROP TABLE ステートメントの実行後にイベント通知を発生させる場合、CREATE EVENT NOTIFICATION ステートメントで FOR DDL_TABLE_EVENTS を指定できます。CREATE EVENT NOTIFICATION の実行後、イベント グループが sys.events カタログ ビューに追加されます。

注意

SQL Server 2005 では、sys.events はグループで対応される個々のイベントのみを一覧表示して、イベント グループを拡張します。したがって、SQL Server 2008 のイベント グループで対応されたイベントに変更を加えても、SQL Server 2005 のイベント グループに対して作成されるイベント通知には適用されません。

イベント通知に使用できる DDL ステートメントと DML ステートメントの定義済みグループの一覧、それらのグループに含まれる特定のステートメント、およびこれらのイベント グループを実行できるスコープについては、「DDL イベント グループ」を参照してください。

イベント通知を発生させる SQL トレース イベントの定義済みグループの選択

イベント通知は、同様のトレース イベントの定義済みグループに属する任意の SQL トレース イベントの実行後に発生させることができます。たとえば、LOCK_DEADLOCK、LOCK_DEADLOCK_CHAIN、LOCK_ESCALATION、および DEADLOCK_GRAPH イベントなど、ロック関連の任意のトレース イベントの実行後にイベント通知を発生させる場合、CREATE EVENT NOTIFICATION ステートメントで FOR TRC_LOCKS を指定できます。

イベント通知で使用可能な定義済みの SQL トレース イベントのグループの一覧については、「イベント通知の実行に使用できるトレース イベント グループ」を参照してください。これらのグループは、サーバー インスタンス レベルでのみ実行できます。