Share via


クエリ通知を使用するときの特別な注意事項 (ADO.NET)

クエリ通知機能を使用するアプリケーションについては、次の特別な注意事項に考慮する必要があります。

考慮事項

説明

SQL Server のサービス アカウント

アプリケーションは、サービス アカウントとしてローカル システム アカウントを使用する SQL Server のインスタンスから通知を受け取ることはありません。詳細については、SQL Server オンライン ブックの「Windows サービス アカウントの設定」を参照してください。

通知の受信

Windows 95 または Windows 98 を実行しているコンピュータで通知を受信することはできません。

クエリ通知およびトランザクション

通知要求が登録されている一連のデータに影響するトランザクション内で複数の変更が行われた場合、送信される通知イベントは 1 つだけになります。

迅速な更新とクエリ通知

クエリ通知を使用するアプリケーションでは、通知が直ちに発生する場合について考慮する必要があります。サーバー上でデータが変更されると、適切な Service Broker キューに通知メッセージが送信されます。追加の通知を受け取るには、アプリケーションの再登録が必要です。そのため、複数のアプリケーションによってデータ セットが次々に更新されると、それぞれのアプリケーションで通知を受け取ってデータを取得し、キャッシュが更新された直後にまた別の更新通知を受け取るといった事態が生じます。クエリ通知を使用するアプリケーションを作成する場合は、この点について考慮する必要があります。絶え間なく更新されるデータを使用するアプリケーションでは、データのキャッシュについて別の方策を立てた方がよい場合があります。

SET オプションの設定

通知要求で SELECT ステートメントが実行されるとき、要求を送信する接続では、接続のオプションを次のように設定する必要があります。

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

通知クエリの作成

通知は SELECT ステートメントおよび EXECUTE ステートメントに対して設定できます。EXECUTE ステートメントを使用した場合、SQL Server では、EXECUTE ステートメント自体ではなく、EXECUTE ステートメントで実行されたコマンドに対する通知が登録されます。コマンドは、SELECT ステートメントの要件と制限を満たしている必要があります。通知を登録するコマンドに複数のステートメントが含まれている場合、データベース エンジンによりバッチ内のステートメントごとに通知が作成されます。

クエリ通知は、次の要件を満たす SELECT ステートメントでサポートされています。

  • SELECT ステートメント内で射影された列は、明示的に指定する必要があります。また、テーブル名は 2 つの部分から構成される名前で修飾する必要があります。つまり、ステートメントで参照されているすべてのテーブルは、同じデータベース内に存在している必要があります。

  • ステートメントでは、アスタリスク (*) または table_name.* 構文を使用して、列を指定することはできません。

  • ステートメントでは、名前のない列または重複した列名は使用できません。

  • ステートメントはベース テーブルを参照する必要があります。

  • ステートメントで GROUP BY 式を使用しない限り、SELECT ステートメント内の射影された列に集計式を含めることはできません。GROUP BY 式を使用すると、選択リストに集計関数 COUNT_BIG() または SUM() を含めることができます。ただし、NULL 値が許容された列には SUM() は指定できません。ステートメントでは、HAVING、CUBE、または ROLLUP を指定できません。

  • 単純な式として使用される SELECT ステートメント内の射影された列は、複数回指定しないでください。

  • ステートメントには、PIVOT 演算子または UNPIVOT 演算子を含めないでください。

  • ステートメントには、INTERSECT 演算子または EXCEPT 演算子を含めないでください。

  • ステートメントでは、ビューを参照しないでください。

  • ステートメントには、DISTINCT、COMPUTE や COMPUTE BY、または INTO のいずれも含めないでください。

  • ステートメントでは、サーバーのグローバル変数 (@@variable_name) を参照しないでください。

  • ステートメントでは、派生テーブル、一時テーブル、またはテーブル変数を参照しないでください。

  • ステートメントでは、他のデータベースやサーバーのテーブルまたはビューを参照しないでください。

  • ステートメントには、サブクエリ、外部結合、または自己結合を含めないでください。

  • ステートメントでは、text、ntext、および image のラージ オブジェクト型を参照しないでください。

  • ステートメントでは、CONTAINS または FREETEXT のフルテキスト述語を使用しないでください。

  • ステートメントでは、OPENROWSET および OPENQUERY などの行セット関数を使用しないでください。

  • ステートメントでは、集計関数 AVG、COUNT(*)、MAX、MIN、STDEV、STDEVP、VAR、または VARP のいずれも使用しないでください。

  • ステートメントでは、順位付け関数やウィンドウ関数などの非決定的関数を使用しないでください。

  • ステートメントには、ユーザー定義集計関数を含めないでください。

  • ステートメントでは、システム テーブル、またはカタログ ビューや動的管理ビューなどのビューを参照しないでください。

  • ステートメントには、FOR BROWSE 情報を含めないでください。

  • ステートメントでは、キューを参照しないでください。

  • ステートメントには、変更したり結果を返すことができない条件ステートメント (たとえば WHERE 1=0) を含めないでください。

詳細については、SQL Server オンライン ブックの「クエリ通知の作成」を参照してください。

参照

概念

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