2012-02-17 7 views
2

理想的には、9.1の新しい「WITH ROWS」機能は、データベースの境界を越えてサポートされていましたが、単一のDBでしか動作しないようです。PostgreSQL 9.1のデータベーステーブルから別のデータベーステーブルに古いデータをアーカイブしますか?

WITH moved_rows AS (
    DELETE FROM events 
    WHERE 
     "date" >= '2010-01-01' AND 
     "date" < '2011-01-01' 
    RETURNING * 
) 
INSERT INTO events_archive 
SELECT * FROM moved_rows; 

私は「LiveDB.events。DELETE FROM」と、私は「ArchiveDB.eventsのINSERT INTO」を行うことができますのようなものとしてイベントを指定することができました望みます。 dblinkは移動する行のリストを取得するようには機能していないようですが、たとえそうであっても、この文がトランザクション間で安全であるかどうかはわかりません...

+0

スキーマは、この場合に役立ちます。彼らはあなたのニーズを満たすことができますか? –

答えて

5

データをファイル(SQL COPYまたはpsql \copy)を削除して1つのトランザクションで削除し、別のトランザクションで別のデータベースにインポートします。これらの2つのステップを1つのトランザクションで実行するには、XA(分散トランザクション)が必要です。 LiveDB

BEGIN TRANSACTION; 
COPY (
    SELECT * FROM events 
    WHERE "date" >= '2010-01-01' 
    AND "date" < '2011-01-01' 
) TO '/tmp/events.csv' WITH CSV HEADER; 

DELETE FROM events 
WHERE "date" >= '2010-01-01' 
AND "date" < '2011-01-01' 
COMMIT; 

から

ダンプArchiveDBに挿入します。助け

COPY events FROM '/tmp/events.csv' WITH CSV HEADER; 

希望。

+1

ちょうどポストグルを使い始めていますが、これがうまくいくと私の多くの問題は解決します。私は再びデータを読み込むためにファイルにデータをダンプするファンではありません...それはいくつかの原油のシナリオのために働くかもしれません。 –

+0

はい、これはdbl​​inkでこれを行う方がはるかにクリーンな方法ですが、あなたの質問に述べたように、dblinkはデータベース境界を越えたトランザクションをサポートしていません。 – tscho

関連する問題