2つの異なるサーバー上にデータベースがあります。サーバーAのテーブルから新しいレコードを定期的に取得し、それらを使用してサーバーBのテーブルを(別のスキーマで)更新するために処理する必要があります。
これにはトリガーを使用する予定でしたが、失敗すると、サーバーAの挿入がロールバックされます。テーブルAへの挿入は失敗してはいけないので、サーバーBの更新はこれから可能な限り切り離す必要があります。
サーバーBでスケジュールされたストアドプロシージャを使用して、サーバーAから結果を取得し、サーバーBを更新することを考えています。これは30秒ごとに実行する必要があります。
このアプローチに何か問題はありますか、またはこれを達成するためのより良いまたはより「正しい」方法はありますか?
サーバーBからサーバーAへの読み取りアクセス権を持つリンクサーバー接続を作成します。サーバーBで次のプロセスを実行します。
サーバーBのテーブルを調べて、サーバーAから最後に挿入されたレコードを特定します。うまくいけば、自動インクリメントの主キー(int)があります。そうでない場合は、最大の「最終更新タイムスタンプ」を探します。
サーバーAに接続し、この主キー/タイムスタンプより大きいすべてのレコードをサーバーAから取得します
これらの新しいレコードをサーバーBに挿入します。
このような自動化システムでは、常に完全なエラートラップとプロセスロギングをお勧めします。それがどのように動作するかを知る必要があり、問題が発生した場合は警告を受ける必要があります。
すべてのロジックをストアドプロシージャに入れ、リンクサーバーを使用してAからBに接続し、処理が終了した後、プロシージャをX秒間スリープさせます。
継続的に実行するように設定されているSQL Serverジョブにストアドプロシージャを配置します。常に実行されているように見えますが、ストアドプロシージャはほとんどの時間スリープしています。
注:継続的に実行するジョブを作成してからsleep(待機ステートメントを使用)する理由は、ジョブ履歴ログが乱雑になります。実際にスケジュール(毎分)で実行するジョブを作成しますが、ストアドプロシージャがスリープしているため、ジョブが終了しません。個人の好みに合わせてチョークで書けます。