Language

クエリ通知の有効化

クエリ通知を使用するには、クエリ通知をサポートするようにデータベースを構成し、データベース プリンシパルに必要なアクセス許可を付与します。

クエリ通知を使用するには、次の手順を実行する必要があります。

  • データベースのクエリ通知を有効にします。

  • データベースへの接続に使用するユーザー ID に必要なアクセス許可があることを確認します。

  • SqlCommandを使用して、関連付けられたSqlNotificationRequestまたはSELECTオブジェクトを持つ有効なSqlDependencyステートメントを実行します。

  • 監視対象のデータが変更された場合に通知を処理するコードを設定する

クエリ通知の要件

クエリ通知は、特定の要件の一覧を満たす SELECT ステートメントでのみサポートされます。 次の表に、SQL Server ドキュメントの Service Broker とクエリ通知のドキュメントへのリンクを示します。

SQL Server のドキュメント

サンプル コードを実行するためのクエリ通知の有効化

SQL Server Management Studioを使用してAdventureWorks データベースに対して Service Broker を有効にするには、次の Transact-SQL ステートメントを実行します。

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

クエリ通知のサンプルを正しく実行するには、次の Transact-SQL ステートメントをデータベース サーバー上で実行する必要があります。

CREATE QUEUE ContactChangeMessages;

CREATE SERVICE ContactChangeNotifications
  ON QUEUE ContactChangeMessages
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

クエリ通知のアクセス許可

データベース プリンシパル SUBSCRIBE QUERY NOTIFICATIONS と、キューの構成に必要な Service Broker のアクセス許可を付与します。 たとえば、プレースホルダーを既存のデータベース ユーザーで置き換えます。

GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [<database_user>];

モダン .NETでは、コード アクセス セキュリティはサポートされていません。 SqlClientPermission.Demandを使用してクエリ通知を認可しないでください。代わりにデータベースのアクセス許可を構成してください。

通知オブジェクトの選択

クエリ通知のサポートでは、 SqlDependency と SqlNotificationRequestの 2 つのオブジェクトで通知を処理できます。 SqlDependencyを使用して変更イベントを受信し、アプリケーションのキャッシュを無効にします。 独自の通知リスナーを実装する必要がある場合は、 SqlNotificationRequest を使用します。

Important

新しい開発には System.Data.SqlClient を使用しないでください。 代わりに Microsoft.Data.SqlClient を使用してください。 ASP.NET Framework SqlCacheDependency クラスは System.Data.SqlClient を必要とし、Microsoft.Data.SqlClient とは統合されていません。 新しい Microsoft.Data.SqlClient アプリケーションでは、SqlDependency.OnChange を処理し、アプリケーションのキャッシュ API を通じてキャッシュを更新します。

SqlDependency の使用

SqlDependency を使用するには、使用する SQL Server データベースに対して Service Broker を有効にし、通知を受け取るためのアクセス許可をユーザーに与える必要があります。 通知キューなどの Service Broker オブジェクトは事前に定義されています。

さらに、 SqlDependency は、キューにポストされると通知を処理するワーカー スレッドを自動的に起動します。また、Service Broker メッセージを解析し、情報をイベント引数データとして公開します。 SqlDependency は、Start メソッドを呼び出し、データベースに対する依存関係を確立して初期化する必要があります。 これは、必要なデータベース接続ごとに、アプリケーションの初期化中に 1 回だけ呼び出す必要がある静的メソッドです。 Stop メソッドは、作成された依存関係の接続ごとにアプリケーションの終了時に呼び出す必要があります。

SqlNotificationRequest の使用

これに対して、SqlNotificationRequest では、監視用インフラストラクチャ全体を自分で実装する必要があります。 さらに、キューでサポートされるキュー、サービス、メッセージの種類など、サポートされているすべての Service Broker オブジェクトを定義する必要があります。 手動によるこの方法は、使用しているアプリケーションで特殊な通知メッセージや通知動作が必要な場合、またはそのアプリケーションが Service Broker アプリケーションの一部である場合に使用すると便利です。

こちらも参照ください