次の方法で共有


イベント通知の作成(Transact-SQL)

適用対象:SQL ServerAzure SQL Managed Instance

データベースまたはサーバー イベントに関する情報を 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

イベント通知の名前。 イベント通知名は 、識別子 の規則に従う必要があり、作成されるスコープ内で一意である必要があります( SERVERDATABASEまたはobject_name)。

SERVER

イベント通知のスコープを現在の Transact-SQL インスタンスに適用します。 指定した場合、 FOR 句で指定されたイベントが SQL Server のインスタンス内の任意の場所で発生するたびに通知が発生します。

注意

このオプションは、包含データベースでは使用できません。

DATABASE

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

QUEUE

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

queue_name

イベント通知が適用されるキューの名前。 queue_name は、 QUEUE が指定されている場合にのみ指定できます。

FAN_INと共に

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

  • 同じイベントで作成されたもの
  • 同じプリンシパルによって作成された (同じ SID で識別される) もの
  • 同じサービスと broker_instance_specifier を指定します。
  • WITH FAN_IN を指定します。

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

event_type

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

event_group

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

event_group は、 CREATE EVENT NOTIFICATION ステートメントが終了したときに、 sys.events カタログ ビューに含まれるイベントの種類を追加することによって、マクロとしても機能します。

'broker_service'

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

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

{ 'broker_instance_specifier' |'current database' }

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

注意

このオプションは、包含データベースでは使用できません。

解説

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

イベント通知を受け取る対象サービスは、この既存のコントラクトに従う必要があります。

重要

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' 句 (8140a771-3c4b-4479-8ac0-81008ab17984) の GUID は、例が設定されたコンピューターに固有です。 その場合、それはAdventureWorks2025データベースのGUIDでした。

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

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 ([http://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. データベース スコープのイベント通知を作成する

次の例では、前の例と同じターゲット サービスに対してイベント通知を作成します。 イベント通知は、AdventureWorks2025のサンプルデータベースで 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';