CREATE EVENT NOTIFICATION (Transact-SQL)

データベース イベントやサーバー イベントに関する情報を Service Broker サービスに送信するオブジェクトを作成します。イベント通知は Transact-SQL ステートメントでのみ作成されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

CREATE EVENT NOTIFICATION event_notification_name 
ON { SERVER | DATABASE | QUEUE queue_name } 
[ WITH FAN_IN ]
FOR { event_type | event_group } [ ,...n ]
TO SERVICE 'broker_service' , { 'broker_instance_specifier' | 'current database' }
[ ; ]

引数

  • event_notification_name
    イベント通知の名前を指定します。イベント通知名は識別子の規則に従っている必要があり、作成先のスコープ (SERVER、DATABASE、または object_name) で一意であることが必要です。

  • SERVER
    イベント通知のスコープを現在の SQL Server インスタンスに適用します。指定した場合、FOR 句で指定したイベントが SQL Server インスタンスで発生するたびに、通知が行われます。

  • DATABASE
    イベント通知のスコープを現在のデータベースに適用します。指定した場合、FOR 句で指定したイベントがデータベースで発生するたびに、通知が行われます。

  • QUEUE
    通知のスコープを現在のデータベースの特定のキューに適用します。QUEUE を指定できるのは、FOR QUEUE_ACTIVATION または FOR BROKER_QUEUE_DISABLED を指定した場合だけです。

  • queue_name
    イベント通知を適用するキューの名前を指定します。queue_name を指定できるのは、QUEUE を指定した場合だけです。

  • WITH FAN_IN
    次の条件に該当するすべてのイベント通知に対して、SQL Server では、イベントごとに 1 メッセージだけを指定のサービスに送信します。

    • 同じイベントで作成されたイベント通知

    • 同じプリンシパルによって作成された (同じ SID で識別される) イベント通知

    • 同じサービスおよび broker_instance_specifier を指定するイベント通知

    • WITH FAN_IN を指定するイベント通知

    たとえば、3 つのイベント通知が作成されたとします。すべてのイベント通知は同じ SID によって作成され、FOR ALTER_TABLE、WITH FAN_IN、および同じ TO SERVICE 句が指定されています。この場合、ALTER TABLE ステートメントを実行すると、これら 3 つのイベント通知で作成されたメッセージは 1 つにマージされます。したがって、対象サービスはイベント メッセージを 1 つだけ受信します。

  • event_type
    イベント通知を実行するイベントの種類の名前を指定します。event_type には、Transact-SQL DDL イベント、SQL トレース イベント、または Service Broker イベントを指定できます。指定できる Transact-SQL DDL イベントの種類については、「DDL イベント」を参照してください。指定できる SQL トレース イベントの種類については、「イベント通知で使用するトレース イベント」を参照してください。Service Broker イベントの種類は QUEUE_ACTIVATION と BROKER_QUEUE_DISABLED です。詳細については、「イベント通知のデザイン」を参照してください。

  • event_group
    Transact-SQL または SQL トレース イベントの定義済みグループの名前を指定します。イベント通知は、イベント グループに属するイベントが実行された後に実行されます。DDL イベント グループと、対応する Transact-SQL イベント、およびそれらを定義できるスコープの一覧については、「DDL イベント グループ」を参照してください。トレース イベント グループと、対応するトレース イベントの一覧については、「イベント通知の実行に使用できるトレース イベント グループ」を参照してください。

    event_group は、対応するイベントの種類を sys.events カタログ ビューに追加した場合、CREATE EVENT NOTIFICATION ステートメントが終了したときにマクロとしても動作します。

  • 'broker_service'
    イベント インスタンスのデータを受信する対象サービスを指定します。SQL Server では、イベント通知用に対象サービスに対して 1 つ以上のメッセージ交換が開きます。このサービスは、同じ SQL Server イベントのメッセージ型と、メッセージの送信に使用されるコントラクトに従っている必要があります。詳細については、「Service Broker サービスの作成」を参照してください。

    メッセージ交換は、イベント通知が削除されるまで開いたままになります。特定のエラーが発生すると、メッセージ交換が予定よりも早く閉じる場合があります。明示的にメッセージ交換の一部または全部を終了することで、対象サービスでそれ以上メッセージを受信しないようにできます。

  • { 'broker_instance_specifier' | 'current database' }
    broker_service を解決する Service Broker インスタンスを指定します。sys.databases カタログ ビューの service_broker_guid 列にクエリを実行することで、特定の Service Broker の値を取得できます。現在のデータベースの Service Broker インスタンスを指定するには、'current database' を使用します。'current database' は大文字と小文字を区別しない文字列リテラルです。

説明

Service Broker には、イベント通知用のメッセージ型とコントラクトが含まれています。したがって、コントラクト名 (https://schemas.microsoft.com/SQL/Notifications/PostEventNotification) を指定する Service Broker 開始サービスが既に存在するため、開始サービスを作成する必要はありません。

イベント通知を受け取る対象サービスは、この既存のコントラクトに従う必要があります。Service Broker 対象サービスの作成方法の詳細については、「Service Broker によるプログラミングの利点」を参照してください。

重要な注意事項重要

リモート サーバー上の Service Broker にメッセージを送信するイベント通知には、Service Broker ダイアログ セキュリティを構成する必要があります。ダイアログ セキュリティは完全なセキュリティ モデルに基づいて手動で構成する必要があります。詳細については、「イベント通知のダイアログ セキュリティ」を参照してください。

通知を有効にしたイベント トランザクションがロールバックされた場合、イベント通知の送信もロールバックされます。トランザクションがトリガー内でコミットまたはロールバックされた場合、トリガーで定義された操作によってイベント通知が行われることはありません。トレース イベントはトランザクションでバインドされないため、トレース イベントに基づくイベント通知は、イベント通知を有効にするトランザクションがロールバックされたかどうかに関係なく送信されます。

イベント通知が行われた後で、サーバーと対象サービスの間のメッセージ交換が解除された場合は、エラーがレポートされ、イベント通知は削除されます。

通知を起動したイベント トランザクションが、イベント通知送信の成功または失敗によって影響を受けることはありません。

イベント通知の送信が失敗した場合はログに記録されます。

権限

データベース スコープ (ON DATABASE) のイベント通知を作成するには、現在のデータベースの CREATE DATABASE DDL EVENT NOTIFICATION 権限が必要です。

サーバー スコープ (ON SERVER) の DDL ステートメントのイベント通知を作成するには、サーバーの CREATE DDL EVENT NOTIFICATION 権限が必要です。

トレース イベントのイベント通知を作成するには、サーバーの CREATE TRACE EVENT NOTIFICATION 権限が必要です。

キュー スコープのイベント通知を作成するには、キューの ALTER 権限が必要です。

注意

以下に示す A と B の例では、TO SERVICE 'NotifyService' 句の GUID ('8140a771-3c4b-4479-8ac0-81008ab17984') は、例をセットアップしたコンピューターに固有の値です。ここで示した例の場合は、AdventureWorks2008R2 データベースの GUID です。

これらの例をコピーして実行するには、この GUID をお使いのコンピューターおよび SQL Server インスタンスの GUID に置き換える必要があります。上の「引数」セクションで説明したように、'broker_instance_specifier' は、sys.databases カタログ ビューの service_broker_guid 列にクエリを実行することで取得できます。

A. サーバー スコープのイベント通知を作成する

次の例では、Service Broker を使用する対象サービスの設定で必要となるオブジェクトを作成します。対象サービスでは、イベント通知専用の開始サービスのメッセージ型とコントラクトが参照されます。作成後は、SQL Server インスタンスで Object_Created トレース イベントが発生するたびに通知を送信する対象サービスに対して、イベント通知が作成されます。

--Create a queue to receive messages.
CREATE QUEUE NotifyQueue ;
GO
--Create a service on the queue that references
--the event notifications contract.
CREATE SERVICE NotifyService
ON QUEUE NotifyQueue
([https://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
GO
--Create a route on the service to define the address 
--to which Service Broker sends messages for the service.
CREATE ROUTE NotifyRoute
WITH SERVICE_NAME = 'NotifyService',
ADDRESS = 'LOCAL';
GO
--Create the event notification.
CREATE EVENT NOTIFICATION log_ddl1 
ON SERVER 
FOR Object_Created 
TO SERVICE 'NotifyService',
    '8140a771-3c4b-4479-8ac0-81008ab17984' ;

B. データベース スコープのイベント通知を作成する

次の例では、前の例と同じ対象サービスに対してイベント通知を作成します。イベント通知は、AdventureWorks2008R2 サンプル データベースで ALTER_TABLE イベントが発生した後に行われます。

CREATE EVENT NOTIFICATION Notify_ALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE 'NotifyService',
    '8140a771-3c4b-4479-8ac0-81008ab17984';

C. サーバー スコープのイベント通知に関する情報を取得する

次の例では、sys.server_event_notifications カタログ ビューをクエリして、サーバー スコープで作成されたイベント通知 log_ddl1 に関するメタデータを取得します。

SELECT * FROM sys.server_event_notifications
WHERE name = 'log_ddl1'

D. データベース スコープのイベント通知に関する情報を取得する

次の例では、sys.event_notifications カタログ ビューをクエリして、データベース スコープで作成されたイベント通知 Notify_ALTER_T1 に関するメタデータを取得します。

SELECT * FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1'