web-dev-qa-db-ja.com

別のサーバーからの新しいレコードでテーブルを定期的に更新する

2つの異なるサーバー上にデータベースがあります。サーバーAのテーブルから新しいレコードを定期的に取得し、それらを使用してサーバーBのテーブルを(別のスキーマで)更新するために処理する必要があります。

これにはトリガーを使用する予定でしたが、失敗すると、サーバーAの挿入がロールバックされます。テーブルAへの挿入は失敗してはいけないので、サーバーBの更新はこれから可能な限り切り離す必要があります。

サーバーBでスケジュールされたストアドプロシージャを使用して、サーバーAから結果を取得し、サーバーBを更新することを考えています。これは30秒ごとに実行する必要があります。

このアプローチに何か問題はありますか、またはこれを達成するためのより良いまたはより「正しい」方法はありますか?

2
chipples

サーバーBからサーバーAへの読み取りアクセス権を持つリンクサーバー接続を作成します。サーバーBで次のプロセスを実行します。

  1. サーバーBのテーブルを調べて、サーバーAから最後に挿入されたレコードを特定します。うまくいけば、自動インクリメントの主キー(int)があります。そうでない場合は、最大の「最終更新タイムスタンプ」を探します。

  2. サーバーAに接続し、この主キー/タイムスタンプより大きいすべてのレコードをサーバーAから取得します

  3. これらの新しいレコードをサーバーBに挿入します。

このような自動化システムでは、常に完全なエラートラップとプロセスロギングをお勧めします。それがどのように動作するかを知る必要があり、問題が発生した場合は警告を受ける必要があります。

すべてのロジックをストアドプロシージャに入れ、リンクサーバーを使用してAからBに接続し、処理が終了した後、プロシージャをX秒間スリープさせます。

継続的に実行するように設定されているSQL Serverジョブにストアドプロシージャを配置します。常に実行されているように見えますが、ストアドプロシージャはほとんどの時間スリープしています。

注:継続的に実行するジョブを作成してからsleep(待機ステートメントを使用)する理由は、ジョブ履歴ログが乱雑になります。実際にスケジュール(毎分)で実行するジョブを作成しますが、ストアドプロシージャがスリープしているため、ジョブが終了しません。個人の好みに合わせてチョークで書けます。

1
datagod