クエリ通知の有効化 (ADO.NET)

クエリ通知を使用するアプリケーションには、いくつか共通する要件があります。 SQL クエリ通知をサポートするには、データ ソースが正しく設定され、ユーザーがクライアント側およびサーバー側の正しい権限を所有している必要があります。

クエリ通知を使用するためには、次のことが必要です。

  • SQL Server 2005 または SQL Server 2008 を使用する

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

  • データベースへの接続に使用するユーザー ID に対して、必要なアクセス許可を設定する

  • SqlCommand オブジェクトを使用して、関連する通知オブジェクト (SqlDependency または SqlNotificationRequest のいずれか) を持つ有効な SELECT ステートメントを実行する

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

クエリ通知の要件

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

SQL Server 2005 オンライン ブック

SQL Server 2008 オンライン ブック

クエリ通知の作成

クエリ通知の作成

Service Broker のセキュリティに関する注意点

セキュリティと保護 (Service Broker)

Notification Services のセキュリティに関する注意点

クエリ通知の権限

Service Broker の国際化に関する注意点

ソリューション設計に関する考慮事項 (Service Broker)

Service Broker 開発者向けの情報

開発者ガイド (Service Broker)

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

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
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);

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

通知を要求するコマンドを実行するユーザーは、特定のサーバーに対する SUBSCRIBE QUERY NOTIFICATIONS データベース アクセス許可を必要とします。

部分信頼の状態で実行されるクライアント側のコードには、SqlClientPermission が必要です。

次のコードでは、SqlClientPermission オブジェクトを作成して、PermissionStateUnrestricted に設定します。 Demand を指定すると、呼び出し履歴の上流に、権限の付与されていない呼び出し元が 1 つでも存在した場合、実行時に強制的に SecurityException が発生します。

' 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
// 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;
    }
}

通知オブジェクトの選択

クエリ通知 API は、通知を処理するために SqlDependencySqlNotificationRequest という 2 つのオブジェクトを提供します。 通常、ASP.NET 以外のほとんどのアプリケーションでは、SqlDependency オブジェクトを使用する必要があります。 ASP.NET アプリケーションは、高レベルの SqlCacheDependency を使用する必要があります。これは SqlDependency をラップし、通知オブジェクトとキャッシュ オブジェクトを管理するためのフレームワークになります。

SqlDependency の使用

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

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

SqlNotificationRequest の使用

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

参照

その他の技術情報

SQL Server のクエリ通知 (ADO.NET)