クエリ通知の有効化

ADO.NET のダウンロード

クエリ通知を使用するアプリケーションには、いくつか共通する要件があります。 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 オブジェクトを作成し、PermissionStateUnrestricted に設定します。 Demand を使用すると、呼び出し履歴の上位にある呼び出し元にアクセス許可が付与されていないものがある場合、実行時に SecurityException が強制されます。

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

    // Code requires directives to
    // System.Security.Permissions and
    // Microsoft.Data.SqlClient

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

通知オブジェクトの選択

クエリ通知 API は、通知を処理するために SqlDependencySqlNotificationRequest という 2 つのオブジェクトを提供します。

SqlDependency の使用

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

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

SqlNotificationRequest の使用

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

次のステップ