2

ユーザーが Confluence wiki でスペースを取り消し不能に削除できないようにしようとしています。私が最初に考えたのは、spacesテーブルの名前を に変更しallspaces、新しい列を追加し、古いテーブルの代わりにdeletedビューを作成することでした。spacesビューは、削除されていないスペースのみを返します。ビューで INSERT、UPDATE、および DELETE を許可する 3 つのルールを作成しましたspaces。DELETE ルールはdeletedフィールドを変更するだけでビューから削除しますが、すべてのデータはデータベースに残ります。

問題は、PostgreSQL からspaces戻ったときの DELETE ステートメントです。DELETE 0これにより、Hibernate が反転して例外が投げられ、Confluence が爆発します。

INSTEAD ルールで削除された行ではなく、変更された行を PostgreSQL に返すようにする方法はありますか。

4

3 に答える 3

1

これがどれだけうまくスケーリングされるかはわかりませんが (管理する必要があるスペースの数によって異なります)、定期的にスペースを XML にバックアップします。これは、 Confluence CLIを使用して API を介して簡単に実行できます。

confluence --action exportSpace --space "spaceName" --file "target/output/confluencecli/spaceName.xml"

これらのバックアップを経過時間に基づいてローテーションし、ユーザーがスペースを削除した場合に最新のもののみを保持できます。

これをさらに一歩進めるには、confluence/spaces/removespace.vm実際にスペースを削除するアクション ( ) を変更し、削除が確認される前にスペースを XML にバックアップするロジックを挿入することができます。これにより、より適切にスケーリングできます。

于 2011-04-30T17:37:57.943 に答える
1

削除された行をアーカイブ テーブルに保存する ON DELETE トリガーを追加できます。アプリケーションにレスキュー機能を追加して、削除された行を回復できます。

于 2011-05-01T23:06:55.943 に答える
0

私は実際にあなたが達成したいことに従っていませんが、おそらく削除ステートメントを VOID を返す関数に入れ、それを呼び出すことができます。

CREATE OR REPLACE FUNCTION delete_space(pid integer)
  RETURNS void AS
$BODY$ 
DECLARE aid INTEGER;
BEGIN
    delete from spaces where id=pid;
    return;
END;
$BODY$
  LANGUAGE 'plpgsql';

使用するには:

select * from delete_space(3);  
于 2010-06-28T05:38:09.940 に答える