3

基本的な問題は次のようなものです
。サブスクライバーは、トランザクション レプリケーションを使用して、パブリッシャーから行を正常にレプリケートしました。では、この行が最後に正常にレプリケートされた時刻を追跡するにはどうすればよいでしょうか?

友人が、SQL Server 2000 で使用した次の解決策を提案しました。
1) datetime 列を追加します。
2) レプリケーション ストアド プロシージャを変更して、datetime 列を更新します (!)。

ステップ 2 は、私の中であらゆる種類の警告ベルを鳴らします。そのため、彼の解決策を詳しく説明する前に、この状況で SQL Server 2005 のより良い解決策があるかどうかを尋ねています。

4

4 に答える 4

1

数週間前、最近変更されたレコードを見つけようとして、まさにこの問題が発生しました。

新しい列を作成し、データ型を TIMESTAMP に設定します。SS2005 は、行が更新されると、この型を自動的に更新します。唯一の問題は、この「タイムスタンプ」が日付や時刻とはまったく関係がないことです。これは、その行の最後に成功した更新 (レプリケーションだけでなく、任意の更新) を反映する単なる数値です。それが必要な場合は、問題ありません。

最後のレプリケーションの更新が必要な場合は、少し複雑になる可能性があり、トリガーとストアド プロシージャで手を汚す必要があります。

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

それが役立つことを願って〜

于 2009-09-14T16:20:39.300 に答える
0

@フィリップ:そのアプローチの主な問題は、ネットワーク接続が悪いため、レプリケーションがよりリモートのデータベースに到達するのに時間がかかる場合があることです。そのため、メイン レコードの更新時刻は、リモート データベースで実際に複製されたレコードの時刻を反映しません。

とにかく、私は友人の方法をテストしましたが、それは私たちの要件に対してうまくいきました.

誰かがこれもやりたい場合は、重要な注意事項があります。サブスクリプションの初期化と将来のスキーマ変更には注意してください。

私の場合、追加された日時列をサブスクライバー データベースに保持するために、スナップショットを手動で初期化することにしました。もう 1 つの方法として、初期化は許可するが、既存のストアド プロシージャを変更して、追加された datetime 列の複製を無視するという方法があります。

于 2008-10-10T08:31:03.520 に答える
0

トランザクション レプリケーションを使用している場合は、プライマリ データの更新時刻を記録し、次のレプリケーション ジョブで他のデータベースにレプリケートされたと考えてみませんか?

于 2008-10-07T08:49:52.640 に答える
0

私はあなたの友人が提案したことを正確に行います。そうすれば、レプリケーション プロシージャの呼び出しのみがタイムスタンプを更新します。

このアプローチの問題は、書き込みロックが必要なことですが、他に実用的な方法はありません。

それ以外の場合は、行をフェッチするときに起動するトリガーを使用できます (引用しないでください。トリガーを使用することはほとんどありません) が、それは正しくないようです (誤検知で終わる可能性があります)。

于 2008-10-03T07:22:17.517 に答える