イベント通知は、Service Broker サービスにイベントに関する情報を送信します。 イベント通知は、これらのイベントに関する情報を Service Broker サービスに送信することで、さまざまな Transact-SQL データ定義言語 (DDL) ステートメントと SQL トレース イベントに応答して実行されます。
イベント通知を使用して、次の操作を行うことができます。
データベースで発生した変更またはアクティビティをログに記録して確認します。
同期的な方法ではなく、非同期でイベントに応答してアクションを実行します。
イベント通知は、DDL トリガーと SQL トレースに代わるプログラミングを提供できます。
イベント通知の利点
イベント通知は、トランザクションのスコープ外で非同期的に実行されます。 そのため、DDL トリガーとは異なり、イベント通知はデータベース アプリケーション内で使用して、即時トランザクションによって定義されたリソースを使用せずにイベントに応答できます。
SQL トレースとは異なり、イベント通知を使用して、SQL トレース イベントに応答して SQL Server のインスタンス内でアクションを実行できます。
イベント データは、SQL Server と共に実行されているアプリケーションが進行状況を追跡し、決定を下すために使用できます。 たとえば、次のイベント通知は、AdventureWorks2012 サンプル データベースでALTER TABLE
ステートメントが発行されるたびに、特定のサービスに通知を送信します。
USE AdventureWorks2012;
GO
CREATE EVENT NOTIFICATION NotifyALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE '//Adventure-Works.com/ArchiveService' ,
'8140a771-3c4b-4479-8ac0-81008ab17984';
イベント通知の概念
イベント通知が作成されると、SQL Server のインスタンスと指定したターゲット サービスの間で 1 つ以上の Service Broker の会話が開かれます。 通常、イベント通知がサーバー インスタンス上のオブジェクトとして存在する限り、会話は開いたままです。 エラーの場合、イベント通知が破棄される前に会話が閉じる可能性があります。 これらの会話は、イベント通知間で共有されることはありません。 すべてのイベント通知には、独自の排他的な会話があります。 メッセージ交換を終了すると、ターゲット サービスがメッセージを受け取るのを明示的に防ぐことができます。また、次回イベント通知が発生した場合でも、メッセージ交換は再度開かなくなります。
イベント情報は、イベントが発生したとき、影響を受けるデータベース オブジェクト、関連する Transact-SQL バッチ ステートメント、およびその他の情報に関する情報を提供する、 xml
型の変数として Service Broker サービスに配信されます。 イベント通知によって生成される XML スキーマの詳細については、 EVENTDATA (Transact-SQL) を参照してください。
イベント通知とトリガー
次の表では、トリガーとイベント通知を比較して比較します。
トリガー (条件や動作を引き起こすもの) | イベント通知 |
---|---|
DML トリガーは、データ操作言語 (DML) イベントに応答します。 DDL トリガーは、データ定義言語 (DDL) イベントに応答します。 | イベント通知は、DDL イベントと SQL トレース イベントのサブセットに応答します。 |
トリガーは、Transact-SQL または共通言語ランタイム (CLR) マネージド コードを実行できます。 | イベント通知ではコードは実行されません。 代わりに、 xml メッセージを Service Broker サービスに送信します。 |
トリガーは、トリガーを発動させるトランザクションの範囲内で同期的に処理されます。 | イベント通知は非同期的に処理される可能性があり、発生の原因となるトランザクションのスコープでは実行されません。 |
トリガーの利用者は、トリガーを発生させるイベントと密接に結び付けられています。 | イベント通知の購読者は、発生の原因となるイベントから切り離されます。 |
トリガーはローカル サーバーで処理する必要があります。 | イベント通知はリモート サーバーで処理できます。 |
トリガーは元に戻すことができます。 | イベント通知はロールバックできません。 |
DML トリガー名はスキーマの範囲内にあります。 DDL トリガー名は、データベース スコープまたはサーバー スコープに関連付けられています。 | イベント通知名のスコープは、サーバーまたはデータベースによって指定されます。 QUEUE_ACTIVATION イベントの通知は、特定のキューを対象としています。 |
DML トリガーは、適用されるテーブルと同じ所有者によって所有されます。 | キュー上のイベント通知の所有者は、それが適用されているオブジェクトとは異なる所有者を持つことができます。 |
トリガーは EXECUTE AS 句をサポートします。 | イベント通知では、EXECUTE AS 句はサポートされていません。 |
DDL トリガー イベント情報は、 xml データ型を返す EVENTDATA 関数を使用してキャプチャできます。 |
イベント通知は、 xml イベント情報を Service Broker サービスに送信します。 情報は、EVENTDATA 関数と同じスキーマに書式設定されます。 |
トリガーに関するメタデータは、 sys.triggers および sys.server_triggers カタログ ビューにあります。 | イベント通知に関するメタデータは、 sys.event_notifications および sys.server_event_notifications カタログ ビューにあります。 |
イベント通知 vs. SQLトレース
次の表は、サーバー イベントを監視するためのイベント通知と SQL トレースを使用して比較および比較します。
SQL トレース (SQL Trace) | イベント通知 |
---|---|
SQL トレースでは、トランザクションに関連するパフォーマンス オーバーヘッドは生成されません。 データのパッケージ化は効率的です。 | XML 形式のイベント データの作成とイベント通知の送信には、パフォーマンスのオーバーヘッドが伴います。 |
SQL トレースは、任意のトレース イベント クラスを監視できます。 | イベント通知では、トレース イベント クラスのサブセットと、すべてのデータ定義言語 (DDL) イベントを監視できます。 |
トレース イベントで生成するデータ列をカスタマイズできます。 | イベント通知によって返される XML 形式のイベント データのスキーマが修正されました。 |
DDL ステートメントがロールバックされるかどうかにかかわらず、DDL によって生成されるトレース イベントは常に生成されます。 | 対応する DDL ステートメント内のイベントがロールバックされた場合、イベント通知は発生しません。 |
トレース イベント データの中間フローの管理には、トレース ファイルまたはトレース テーブルの設定と管理が含まれます。 | イベント通知データの中間管理は、Service Broker キューを介して自動的に実行されます。 |
トレースは、サーバーが再起動されるたびに再起動する必要があります。 | 登録後、イベント通知はサーバー サイクル間で保持され、処理されます。 |
開始された後、トレースの起動を制御することはできません。 停止時間とフィルター時間を使用して、開始時刻を指定できます。 トレースにアクセスするには、対応するトレース ファイルをポーリングします。 | イベント通知は、イベント通知によって生成されたメッセージを受信するキューに対して WAITFOR ステートメントを使用して制御できます。 キューを確認することでアクセスできます。 |
ALTER TRACE は、トレースを作成するために必要な最小限のアクセス許可です。 対応するコンピューターにトレース ファイルを作成するには、アクセス許可も必要です。 | 最小アクセス許可は、作成されるイベント通知の種類によって異なります。 対応するキューでも受信権限が必要です。 |
トレースはリモートで受信できます。 | イベント通知はリモートで受信できます。 |
トレース イベントは、システム ストアド プロシージャを使用して実装されます。 | イベント通知は、データベース エンジンと Service BrokerTransact-SQL ステートメントの組み合わせを使用して実装されます。 |
トレース イベント データには、対応するトレース テーブルのクエリを実行するか、トレース ファイルを解析するか、SQL Server 管理オブジェクト (SMO) TraceReader クラスを使用してプログラムでアクセスできます。 | イベント データには、XML 形式のイベント データに対して XQuery を発行するか、SMO イベント クラスを使用してプログラムでアクセスします。 |
イベント通知タスク
課題 | トピック |
---|---|
イベント通知を作成して実装する方法について説明します。 | イベント通知を実装する |
リモート サーバー上の Service Broker にメッセージを送信するイベント通知の Service Broker ダイアログ セキュリティを構成する方法について説明します。 | イベント通知のダイアログ セキュリティの構成 |
イベント通知に関する情報を返す方法について説明します。 | イベント通知に関する情報を取得する |