7

問題:

多くの異なるアプリケーションによって (共通のアプリケーション レイヤーなしで) 直接入力される、多数の異なるデータベースがあります。データは SP を介してのみアクセス可能 (ポリシーによる)

仕事:

アプリケーションは、これらのデータベースの変更を追跡し、最小限の時間で対応する必要があります。

可能な解決策:

1) 各データベースのテーブルごとにトリガーを作成します。これにより、1 つのテーブルにイベントが入力されます。アプリケーションは、SqlDependency を通じてこのテーブルを監視します。

2) SqlDependency を通じて各データベースの各テーブルを監視します。

3) 各データベースのテーブルごとにトリガーを作成し、マネージド拡張機能を使用してアプリケーションに通知します。

最良の方法はどれですか?

4

3 に答える 3

5

これは広範囲にわたるトピックになる可能性があります。まず第一に:使用されているSQL Serverのバージョンは何ですか?

SQL 2008を使用している場合は、変更データキャプチャが最適なツールです。この新機能を使用すると、SQL 2008内のデータベースに加えられたすべての変更を監視できます。これには、DDLの変更データの変更が含まれます。ここで紹介を確認してください。

古いバージョンのSQL2008を使用していて、データベースのDDLを変更できる場合は、オプション3が(一度説明したものの)選択肢の1つになります。ただし、トランザクションがロールバックした場合や、一括挿入時にトリガーが非アクティブ化された場合など、考慮すべき点が他にもあるため、お勧めしません。

これらすべての場合にソリューションを適切に機能させることは、静かな挑戦です。

もう1つの方法は、トランザクションログファイルを監視することです。独自のログ形式に関するドキュメントがほとんどないため、この方法は断然最善ですが、最も複雑な方法でもあります。また、SQLServerの特定のバージョンにバインドされています。これにより、選択したデータベースの影響を監視できなくなります。

さらに別のアプローチは、監視対象のデータのコピーを作成し、違いがあるかどうかを定期的にチェックすることです。これには、ソースデータベースに変更を加える必要がないという利点があります。トランザクションや一括挿入の問題を取り除くだけでなく。最新の次の監視実行以降、変更を発見できるようになります。

監視対象のテーブルに対してプライマリインデックスの連続読み取りのみが必要になるため、パフォーマンスへの影響はかなり最小限に抑えられます。そして、これはデータベースと対話するための最も最適化された方法です。ただし、このアプローチにはかなりの開発努力が必要になります。これがここ数年以来の私の主な焦点なので、私は知る必要があります。ここをチェックしてください;)

(リンクが問題ないことを願っています。この場合はトピックにあるので、それ以外の場合は削除します)

于 2010-04-22T08:48:49.107 に答える
0

SQLプロファイラーを使用する可能性を検討しませんか。フィルタを使用すると、更新操作のみを選択して、ログに書き込むことができます。

于 2010-04-22T08:26:03.537 に答える
0

SqlDependencyクラスのオープン ソース実現である SqlDependencyEx を使用できます。データベース トリガーとネイティブの Service Broker 通知を使用して、テーブルの変更に関するイベントを受け取ります。これは使用例です:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

SqlDependecyEx を使用すると、UPDATE を回避して、INSERT または DELETE のみを監視できます。お役に立てれば。

于 2015-02-23T12:25:48.717 に答える