1

dblinkを使用してリモートデータベースをローカルデータベースにリンクしようとしています。ここで達成したいことは次のとおりです。

  1. リモートデータベースのテーブルから10秒ごとに最新の行からデータのみをフェッチしたい。

  2. ローカルデータベースの既存のテーブルにデータを挿入したいと思います。この場合、リモートデータベースから収集したデータに加えて、主キーなどの他のデータと、リモートデータベースから取得できないシーケンスをテーブルに挿入します。

任意の提案をいただければ幸いです。

4

1 に答える 1

2
  • 行がそこに挿入または更新されるたびに増加するリモートテーブルにインデックス付きの列が必要です(タイムスタンプではありません。多くの行が同じタイムスタンプを持つ可能性があるため、コンピューターの時計は時々逆行する可能性があります)。更新しない場合は、シリアル主キーで十分です (これに依存する場合は、トリガーで更新が許可されないように強制します)。削除も同期されないため、トリガーの使用も許可されないようにすることをお勧めします。

  • 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` であると仮定します。

于 2012-06-19T11:01:54.473 に答える