Share via


クエリ通知が行われる時点について

クエリ通知には、通知メッセージが到着するまで、アプリケーションはキャッシュされたデータに依存できるという基本的な考え方があります。SQL Server がキャッシュされたデータの信頼性を保証できなくなると、SQL Server は通知メッセージを送信します。SQL Server では、次のイベントのいずれかが発生すると、サブスクリプションのクエリ通知を送信します。

  • クエリ結果に含まれている行が変更された。

  • サブスクリプションの有効期限が切れた。

  • サーバーが再起動された。

  • クエリ通知サブスクリプションを作成できなかった (たとえば、「クエリ通知の作成」で示した要件に SELECT ステートメントが準拠していない場合)。

  • サーバーの負荷が高い。

  • サブスクリプションが依存しているオブジェクトが削除または変更された。

SQL Server では、データが変更されないイベント、または実際にはクエリの結果に影響しない変更に応じて、クエリ通知が生成される場合があることに注意してください。たとえば、クエリで返された行のいずれかが UPDATE ステートメントによって変更されると、行に対する更新によってクエリ結果内の列が変更されなかったとしても、通知が行われることがあります。クエリ通知は、データをキャッシュするアプリケーションのパフォーマンスを向上するという全体的な目的をサポートするように設計されています。SQL Server では、サーバーの負荷が高い場合は、クエリの結果が変更されたかどうかを判断する作業は実行しないで、サブスクリプションのクエリ通知メッセージが生成されることがあります。

データベース エンジンでサブスクリプション要求の各ステートメントが実行される前に、通知のサブスクリプションが発生します。したがって、クエリから返されたデータを変更するステートメントとクエリの両方がコマンドに含まれていると、サブスクリプション要求を含むコマンドが完了する前に、アプリケーションが通知メッセージを受信する可能性があります。

各サブスクリプションでは、最短有効期間が指定されます。最短有効期間経過後は、SQL Server でサブスクリプションが削除され、通知メッセージが作成されます。通知がアクティブではなくなり、SQL Server がクエリへの変更を追跡していないことが、メッセージによってアプリケーションに通知されます。

SQL Server を起動すると、サーバーはデータベース内のすべてのクエリ通知サブスクリプションに対して、クエリ通知メッセージを自動的に作成します。これにより、アプリケーションはキャッシュされたデータをすぐに更新できます。また、各通知でクエリを処理しないで SQL Server を起動できます。データベースを削除すると、データベース エンジンはそのデータベースに登録されているすべてのサブスクリプションに対して、クエリ通知メッセージを生成します。

クエリ通知の要件を満たさないクエリと共に通知のサブスクリプション要求が送信されると、データベースはクエリ通知メッセージをすぐに生成します。このメッセージでは、クエリがサブスクリプションの要件を満たさなかったことがアプリケーションに通知されます。また、SQL Server はクエリへの変更を追跡できないので、アプリケーションはすぐにクエリ結果が古くなったと見なす必要があります。

注意

依存オブジェクト (ADO.NET の SqlDependency など) によって管理されるクエリ通知サブスクリプションでは、アプリケーションとデータベースを接続できなかった場合はイベントが生成されません。ただし、アプリケーションが再度データベースにアクセスできるようになると、データベースにアクセスできなかった間に作成された通知がすぐにアプリケーションに通知されます。

コマンドが通知メッセージを生成するときは、通知メッセージを生成するトランザクション内で、通知メッセージの作成や送信の処理がステートメントの一部として行われます。データベース エンジンが通知メッセージを正常に作成および送信できない場合はコマンドが失敗し、SQL Server エラー ログにエラーが記録されます。通知メッセージが生成されるときは、データベース エンジンで通知メッセージが正常に生成されたかどうかにかかわらず、データベース エンジンで通知のサブスクリプションが削除されることに注意してください。

注意

サブスクリプションを作成したデータベース ユーザー アカウントが削除されるか無効になるとき、サブスクリプションを含むデータベースがアタッチされるとき、またはサブスクリプションを削除するために KILL QUERY NOTIFICATION SUBSCRIPTION が使用されたときは、通知メッセージが生成されずにサブスクリプションが削除されます。