SQL Server 2005でサブスクライバーの複製された行の時間をどのように追跡しますか?

StackOverflow https://stackoverflow.com/questions/161890

質問

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

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

ステップ#2は、あらゆる種類の警告の鐘を鳴らします。そのため、彼のソリューションを詳しく説明する前に、この状況でSQL Server 2005に適したソリューションがあるかどうかを尋ねています。

役に立ちましたか?

解決

私はあなたの友人が提案したとおりにします。この方法では、レプリケーションプロシージャの呼び出しのみがタイムスタンプを更新します。

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

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

他のヒント

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

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

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

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

役立つことを願っています〜

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top