クエリ通知を使用するアプリケーションには、いくつか共通する要件があります。 データ ソースは、SQL クエリ通知をサポートするように正しく構成されている必要があり、ユーザーは正しいクライアント側およびサーバー側のアクセス許可を持っている必要があります。
クエリ通知を使用するには、次の手順を実行する必要があります。
データベースのクエリ通知を有効にします。
データベースへの接続に使用するユーザー ID に必要なアクセス許可があることを確認します。
SqlCommand オブジェクトを使用して、通知オブジェクト (SqlDependency または SqlNotificationRequest のいずれか) が関連付けられている有効な SELECT ステートメントを実行します。
監視対象のデータが変更された場合に通知を処理するコードを設定する
クエリ通知の要件
クエリ通知は、特定の要件を満たす SELECT ステートメントでのみサポートされます。 次の表に、SQL Server ドキュメントの Service Broker とクエリ通知のドキュメントへのリンクを示します。
SQL Server のドキュメント
サンプル コードを実行するためのクエリ通知の有効化
AdventureWorks データベースで Service Broker を有効にするには、SQL Server Management Studio を通じて、次の 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 データベース アクセス許可を必要とします。
部分的に信頼される状況で実行されるクライアント側のコードには SqlClientPermission が必要です。
次のコードは SqlClientPermission オブジェクトを作成し、PermissionState を Unrestricted に設定します。 呼び出し履歴の上位にあるすべての呼び出し元にアクセス許可が付与されていない場合、 Demand は実行時に SecurityException を強制します。
// Code requires directives to
// System.Security.Permissions and
// System.Data.SqlClient
private bool CanRequestNotifications()
{
SqlClientPermission permission =
new SqlClientPermission(
PermissionState.Unrestricted);
try
{
permission.Demand();
return true;
}
catch (System.Exception)
{
return false;
}
}
' Code requires directives to
' System.Security.Permissions and
' System.Data.SqlClient
Private Function CanRequestNotifications() As Boolean
Dim permission As New SqlClientPermission( _
PermissionState.Unrestricted)
Try
permission.Demand()
Return True
Catch ex As Exception
Return False
End Try
End Function
通知オブジェクトの選択
クエリ通知 API は、通知を処理するために SqlDependency と SqlNotificationRequest という 2 つのオブジェクトを提供します。 一般に、ほとんどの non-ASP.NET アプリケーションでは、 SqlDependency オブジェクトを使用する必要があります。 ASP.NET アプリケーションでは、SqlDependencyをラップし、通知オブジェクトとキャッシュ オブジェクトを管理するためのフレームワークを提供する、上位レベルのSqlCacheDependencyを使用する必要があります。
SqlDependency の使用
SqlDependency を使用するには、使用する SQL Server データベースに対して Service Broker を有効にし、通知を受け取るためのアクセス許可をユーザーに与える必要があります。 通知キューなどの Service Broker オブジェクトは事前に定義されています。
さらに、 SqlDependency は、キューにポストされると通知を処理するワーカー スレッドを自動的に起動します。また、Service Broker メッセージを解析し、情報をイベント引数データとして公開します。
SqlDependency は、Start
メソッドを呼び出し、データベースに対する依存関係を確立して初期化する必要があります。 これは、必要なデータベース接続ごとに、アプリケーションの初期化中に 1 回だけ呼び出す必要がある静的メソッドです。
Stop
メソッドは、作成された依存関係の接続ごとにアプリケーションの終了時に呼び出す必要があります。
SqlNotificationRequest の使用
これに対して、SqlNotificationRequest では、リッスンしているインフラストラクチャ全体を自分で実装する必要があります。 さらに、キューでサポートされるキュー、サービス、メッセージの種類など、サポートされているすべての Service Broker オブジェクトを定義する必要があります。 手動によるこの方法は、使用しているアプリケーションで特殊な通知メッセージや通知動作が必要な場合、またはそのアプリケーションが Service Broker アプリケーションの一部である場合に使用すると便利です。