クエリ通知の操作
適用対象: SQL Server
クエリ通知は、SQL Server 2005 (9.x) と OLE DB Driver for SQL Server で導入されました。 クエリ通知は SQL Server 2005 (9.x) に導入された SQL Service Broker インフラストラクチャに基づいて構築されており、データが変更されたときにアプリケーションに通知できます。 Web アプリケーションのように、データベースから情報のキャッシュを提供し、ソース データの変更時に通知を受け取る必要があるアプリケーションでは、この機能が便利です。
クエリ通知を使用することで、クエリの基になるデータが変更された場合に、指定されたタイムアウト期間内に通知を要求することができます。 要求する際は、サービス名、メッセージ テキスト、サーバーのタイムアウト値などの通知オプションを指定します。 通知は Service Broker キューを使用して配信されます。アプリケーションではこのキューにポーリングして、使用可能な通知を確認できます。
クエリ通知オプションの構文を次に示します。
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
次に例を示します。
service=mySSBService;local database=mydb
通知サブスクリプションは、それを開始したプロセスよりも長い有効期間を持っています。 これは、アプリケーションによってサブスクリプションの作成と終了処理が行われるためです。 サブスクリプションは有効のままとなるため、指定したタイムアウト期間内にデータが変更されると、通知が行われます。 通知は、実行されるクエリ、通知オプション、およびメッセージ テキストによって識別されます。 そのタイムアウト値を 0 に設定することでキャンセルできます。
通知は、一度だけ送信されます。 データ変更の通知を継続して受け取るには、各通知が処理された後にクエリを再実行して、新しいサブスクリプションを作成します。
OLE DB Driver for SQL Server アプリケーションでは、通常、Transact-SQL の RECEIVE コマンドを使用して通知を受け取ります。 このコマンドを使用して、通知オプションで指定されているサービスに関連付けられたキューから通知を読み取ります。
注意
通知を必要とするクエリ内のテーブル名は、修飾された名前にする必要があります。 たとえば、「 dbo.myTable
」のように入力します。 テーブル名は、2 つの部分を持つ修飾名にする必要があります。 3 つまたは 4 つの部分を持つ名前を使用すると、サブスクリプションが無効になります。
この通知インフラストラクチャは、SQL Server 2005 (9.x) で導入されたキュー処理機能に基づいて構築されています。 一般的に、サーバーで生成された通知は、後で処理するためにキュー経由で送信されます。
クエリ通知を使用するには、クエリとサービスがサーバー上に存在する必要があります。 これらのアイテムは、次のような Transact-SQL コマンドを使用して作成できます。
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
注意
上記のように、サービスでは定義済みのコントラクトを使用する必要があります。
OLE DB Driver for SQL Server
OLE DB Driver for SQL Server では、行セットが変更されたときのコンシューマー通知がサポートされています。 コンシューマーは、行セットの変更のすべてのフェーズと、変更が試行されたときに通知を受け取ります。
注意
OLE DB Driver for SQL Server を使用してクエリ通知をサブスクライブする場合、唯一の有効な方法は、ICommand::Execute を使用してサーバーに通知クエリを渡す方法です。
DBPROPSET_SQLSERVERROWSET プロパティ セット
OLE DB によるクエリ通知のサポートを目的に、OLE DB Driver for SQL Server によって、次の新しいプロパティが DBPROPSET_SQLSERVERROWSET
プロパティ セットに追加されました。
名前 | 種類 | 説明 |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | クエリ通知をアクティブのままにしておく秒数。 既定値は 432,000 秒 (5 日) です。 最小値は 1 秒であり、最大値は 2^31-1 秒です。 |
SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | 通知のメッセージ テキスト。 このテキストはユーザーが定義するため、定義済みの書式はありません。 既定では、文字列は空です。 1 から 2000 文字を使用してメッセージを指定します。 |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | クエリ通知オプション。 これらのオプションは、name=value 構文を含む文字列内に指定されます。 ユーザーがサービスを作成して、キューから通知を読み取る必要があります。 既定値は空の文字列です。 |
通知サブスクリプションは常にコミットされます。 これは、ステートメントが実行されたのがユーザー トランザクションかオートコミットか、またはステートメントが実行されたトランザクションがコミットされたかロールバックされたかに関係なく実行されます。 サーバー通知は、次の無効通知条件のいずれかが最初に発生したときに起動します。通知条件は、基になるデータまたはスキーマが変更されるか、タイムアウト期間に到達するかです。
通知登録は、起動直後に削除されます。 したがって、通知を受け取った後も引き続き更新するには、アプリケーションで再度サブスクライブする必要があります。
他の接続またはスレッドは、接続先キューに通知があるかどうかを確認できます。 次に例を示します。
WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.
注意
SELECT *
では、キューからエントリが削除されることはありません。 一方、RECEIVE * FROM
では行われます。 このため、キューが空の場合は、サーバー スレッドが保留されます。 呼び出しの時点でキューにエントリがある場合は、直ちに返されます。 それ以外の場合、呼び出しはキューにエントリが作成されるまで待機します。
RECEIVE * FROM MyQueue
キューが空の場合、このステートメントでは空の結果セットが直ちに返されます。 それ以外の場合は、すべてのキュー通知が返されます。
SSPROP_QP_NOTIFICATION_MSGTEXT
と SSPROP_QP_NOTIFICATION_OPTIONS
が null でも空でもない場合は、上で定義されている 3 つのプロパティが含まれるクエリ通知 TDS ヘッダーがサーバーに送信されます。 このヘッダーは、コマンドの実行ごとに送信されます。 それらのいずれかが null (または空) の場合、ヘッダーは送信されず、DB_E_ERRORSOCCURRED
が発生します (または、プロパティが両方ともオプションとしてマークされている場合は、DB_S_ERRORSOCCURRED
が発生します)。 その後、状態の値は DBPROPSTATUS_BADVALUE
に設定されます。 実行と準備の時点で検証が行われます。 同様に、クエリ通知プロパティが SQL Server 2005 (9.x) より前のバージョンの SQL Server への接続に対して設定されている場合は、DB_S_ERRORSOCCURED
が発生します。 この場合、状態の値は DBPROPSTATUS_NOTSUPPORTED
です。
サブスクリプションを開始しても、メッセージが今後正常に配信されるかどうかは保証されません。 指定されたサーバー名の妥当性に関するチェックも行われません。
注意
ステートメントを準備しても、サブスクリプションが開始されることはありません。 ステートメントを実行したときにのみ開始されます。 OLE DB コア サービスを使用しても、クエリ通知は影響を受けません。
DBPROPSET_SQLSERVERROWSET
プロパティ セットについて詳しくは、「行セットのプロパティと動作」をご覧ください。