web-dev-qa-db-ja.com

SQL Server 2008での変更通知

データベースといくつかのサービスで構成されるアプリケーションがあります。これらのサービスの1つは、データベースに情報を追加します(ユーザーによってトリガーされます)。

別のサービスは定期的にデータベースに変更を照会し、新しいデータを処理の入力として使用します。

これまでは、30秒ごとにデータベースにクエリを行う構成可能なタイマーを使用していました。変更の通知をフィーチャーしたSQL 2005について読みました。ただし、SQL 2008では、この機能は廃止されています。

データベースで発生した変更をコードで直接通知する最良の方法は何ですか?ベストプラクティスは何ですか?

35
Mephisztoe

Notification Servicesは廃止されましたが、とにかくそれを使用したくありません。

一部のシナリオでは、Service Brokerメッセージを検討する場合があります。詳細はアプリによって異なります。

ほとんどの場合、SqlDependencyまたはSqlCacheDependencyを使用できます。それらが機能する方法は、発行時にクエリにSqlDependencyオブジェクトを含めることです。クエリは、単一のSELECTまたはストアドプロシージャ内のコマンドの複雑なグループにすることができます。

しばらくして、別のWebサーバー、ユーザー、またはWebページがDBに変更を加えると、前のクエリの結果が変更される可能性がある場合、SQL ServerはSqlDependencyオブジェクトを登録したすべてのサーバーに通知を送信します。これらのイベントが到着したときに実行するコードを登録するか、イベントがキャッシュ内のエントリを単にクリアすることができます。

Service BrokerでSqlDependencyを使用できるようにする必要がありますが、明示的に操作する必要はありません。ただし、これを代替メカニズムとして使用することもできます。メッセージの順序と一度だけの配信を保証する永続的なメッセージングシステムとして考えてください。

これらのシステムの使用方法の詳細は、フォーラムの投稿としては少し長くなります。あなたは彼らのためにグーグルすることができます、または私はまた私の本で例を提供します( ltra-Fast ASP.NET )。

18
RickNZ

データベースの変更を追跡する方法はいくつかあります。バックログ、追跡ログ(別名「監査テーブル」)などの一時的な構造を維持するトリガーによる方法、またはSQL 2008の変更追跡機能を別の回答の参照として使用する方法です。使用するメカニズムに関係なく、変更を自社サービスに通知するという問題があります。これには、Service Brokerとイベントベースのアクティブ化を使用できます。あなたの説明から、アプリケーションがキューからのイベントを待機しているように見えます。 http://msdn.Microsoft.com/en-us/library/ms171581.aspx

サービスを待機させてキューでスリープさせたくない場合は、Service Brokerの外部アクティベーションメカニズムを使用して、サービスを「オンデマンド」で起動することを検討できます。

3
Paul Harrington

はい、 このブログ投稿 は、Notification Servicesが非推奨になり、今後の代替品や代替品についても説明しています。

あなたの目的のために-dataaseで発生した変更の通知を取得する-それはあなたが望むように聞こえます SQL Server Change Tracking 。ただし、通知はプルモデルです。アプリは変更テーブルに対してクエリを実行する必要があります。

SqlDependencyが非推奨のNotification Servicesで引き続き機能するかどうかを判断できませんでした。

3
Cheeso

System.Data.SqlClient.SqlDependency(Service Brokerで動作)を使用して、テーブルの変更をサブスクライブできます。

2
Nestor