dblinkを使用してリモートデータベースをローカルデータベースにリンクしようとしています。ここで達成したいことは次のとおりです。
リモートデータベースのテーブルから10秒ごとに最新の行からデータのみをフェッチしたい。
ローカルデータベースの既存のテーブルにデータを挿入したいと思います。この場合、リモートデータベースから収集したデータに加えて、主キーなどの他のデータと、リモートデータベースから取得できないシーケンスをテーブルに挿入します。
任意の提案をいただければ幸いです。
dblinkを使用してリモートデータベースをローカルデータベースにリンクしようとしています。ここで達成したいことは次のとおりです。
リモートデータベースのテーブルから10秒ごとに最新の行からデータのみをフェッチしたい。
ローカルデータベースの既存のテーブルにデータを挿入したいと思います。この場合、リモートデータベースから収集したデータに加えて、主キーなどの他のデータと、リモートデータベースから取得できないシーケンスをテーブルに挿入します。
任意の提案をいただければ幸いです。
行がそこに挿入または更新されるたびに増加するリモートテーブルにインデックス付きの列が必要です(タイムスタンプではありません。多くの行が同じタイムスタンプを持つ可能性があるため、コンピューターの時計は時々逆行する可能性があります)。更新しない場合は、シリアル主キーで十分です (これに依存する場合は、トリガーで更新が許可されないように強制します)。削除も同期されないため、トリガーの使用も許可されないようにすることをお勧めします。
PostgreSQL には定期的なタスクのメカニズムがないため、データベースに接続して同期を実行する cron (または Windows ではスケジューラ) ジョブが必要です。
このジョブは次のようになります。
トランザクションを開始します。 テーブル local_tablename を排他モードでロックします。 dblink_connect(…); local_tablename (id、data、row_counter) に挿入します。 select * from dblink( 'remote_tablename から id、data、row_counter を選択 where row_counter>'||(local_tablenameからcoalesce(max(row_counter),-1)を選択) ) as t(id int, data text, row_counter int); 専念;
別の同期ジョブと同時に実行すると (たとえば、前のジョブに 10 秒以上かかった場合) 中断する可能性があるため、トランザクション内にあり、ロックで保護する必要があります。
`local_tablename` にまだ行がない場合は、`coalesce` が必要です。これがないと何も挿入されません。常に `row_counter>=0` であると仮定します。