6

.NetアプリケーションからSQLServer(2005または2008)データベースのテーブルレコードの変更を監視する方法を知っている人はいますか?一度に複数のクライアントをサポートできる必要があります。各クライアントは、起動時に「サブスクライブ」し、終了時に「サブスクライブ解除」します。複数のユーザーが同時にシステムにアクセスしている可能性があり、それらの変更を他のユーザーのクライアントに反映させたいと思います。次に、クライアントが変更イベントを処理するときに、そのレコードを表すローカルオブジェクトを更新できます。変更されたAccessの更新レコードが、それを参照する各フォームに反映されるのと似ています。

マイクロソフトには、SQLServerと対話するためのMicrosoft.SqlServerライブラリがあることを私は知っています。しかし、どの概念が自分のやりたいことに当てはまるのか(または、自分のやりたいことに当てはまるように曲げることができるのか)はわかりません。それらが役立つと思われるものは、管理のものまたはレプリケーションのものです。

誰かが「新しい情報を探すために時々テーブルを再クエリしてみませんか?」と尋ねるのを見越して。監視したいテーブルがたくさんあるので、それはお尻の痛みになります。さらに、もう少しエレガントなものを探している場合。

私は提案を受け入れています...

4

5 に答える 5

7

SQL 2005 以降で SQL テーブルまたはレコードへの変更を監視するには、SqlDependency クラスを利用できます。

サブスクリプションを管理する数百のクライアントではなく、単一のサーバーがデータベースに対してアクティブなサブスクリプションを管理している ASP.NET または中間層サービスでの使用を対象としています。参照しているクライアントの最大数によっては、クライアントへの SQL に対する通知サブスクリプションを管理できるキャッシュ プール サービスを構築する必要がある場合があります。

内部では、Notification Services ではなく Service Broker を使用する SqlNotificationRequest を使用します。したがって、これは SQL 2008 などで今後も機能するはずです。

SqlDependency の MSDN

void Initialization()
{
    // Create a dependency connection.
    SqlDependency.Start(connectionString, queueName);
}

void SomeMethod()
{
  // Assume connection is an open SqlConnection.

  // Create a new SqlCommand object.
  SqlCommand command=new SqlCommand(
    "SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", 
    connection);

  // Create a dependency and associate it with the SqlCommand.
  SqlDependency dependency=new SqlDependency(command);
  // Maintain the refence in a class member.

  // Subscribe to the SqlDependency event.
  dependency.OnChange+=new OnChangeEventHandler(OnDependencyChange);

  // Execute the command.
  command.ExecuteReader();
  // Process the DataReader.
}

// Handler method
void OnDependencyChange(object sender, 
   SqlNotificationsEventArgs e )
{
  // Handle the event (for example, invalidate this cache entry).
}

void Termination()
{
    // Release the dependency.
    SqlDependency.Stop(connectionString, queueName);
}

SQL 2005 クエリ通知の使用と監視」の記事では、Service Broker などをサブスクライブするために必要な適切な SQL 権限と共に、(例として Web アプリを使用して) コードで設定する手順について説明しています。

Web シナリオでは、ASP.NET (Web キャッシュ)クラスも使用できます。

于 2009-05-21T21:35:29.370 に答える
2

SQL Server 2008 には、挿入、更新、または削除が発生したときに追跡できる変更追跡があります。これにより、イベントが発生したこと、イベントが発生したレコード、およびオプションで変更されたが値 (前後) ではない列が追跡されます。これは通常、変更された既知のデータを使用して一括処理を実行するために使用されます。

変更の追跡では、変更を保持するための保持期間を設定します。通常は、追跡対象のテーブルの処理が保持期間内であることを保証する期間です。

または、(SQL 2008 では) 変更データ キャプチャがあります。これは、より詳細で、実際の変更を記録します。ただし、これはエンタープライズ機能のみです。

変更追跡または変更データ キャプチャ クエリを実行する .NET アプリケーションを簡単に作成できます。

ここに両方の​​詳細情報へのリンクがあります

変更追跡

変更データ キャプチャ

ほとんどの場合、Change Tracking がおそらく最良のオプションになるでしょう。さらに、SQL Server 2008 のすべてのバージョンで機能します。

2005年以降にこれを達成したい場合は、基本的に、追跡するテーブルごとにテーブルを作成し、挿入、更新、削除時に追跡テーブルに値を挿入するトリガーを設定できます。次に、これをクリアするプロセスを用意します。これは基本的に、Change Tracking が行うことです。

于 2008-12-05T09:03:21.280 に答える
0

私は質問を読み違えたと思います。

これは、ロック コントロールを備えた標準的なマルチ ユーザー アプリケーションのようです。ユーザーはログオンし、サーバー上のデータにアクセスします (サブスクライブ)。ユーザーがログオフ (登録解除) します。

それとも、変更を同期したい切断されたアプリケーションですか?

切断されたアプリケーションの場合、SQL Server の syncservices を使用できます。

それ以外は、LINQ to Entities を使用するだけで、オブジェクトの変更を保存するときに競合を処理できます。LINQ によって生成されるクエリのパフォーマンスを確保するために、各テーブルに TIMESTAMP 列を追加できますが、必須ではありません。

于 2008-12-05T11:57:14.487 に答える
0

個人的には使用していませんが、Notification Services は一見の価値があるようです

詳細はこちら...

于 2008-12-04T21:12:07.143 に答える
0

通常、このシナリオはうまくスケーリングできません... SQL 通知サービスを調べることもできますが、これには同じ問題があります。

あるシステムでは、テーブル、変更タイプ、および行 ID を含む変更の簡単な要約を (単一の) デルタ テーブルに書き込むトリガーを使用してこれを行います。各クライアントは「どこまで読んだか」を保持し、id > この番号を持つすべてのデルタ レコードを要求するだけです。問題は、個々のクライアントの変更履歴を破棄せずにテーブルをクリアするために、いくつかの巧妙なことを行う必要があることです...つまり、ログオフを追跡し、特定の時間を過ぎて死んでいると想定し、完全な更新を行ったときにログを記録します。

確かに実行可能ですが、多くの作業が必要です。

于 2008-12-04T21:14:31.493 に答える