我试图阻止用户在Confluence wiki中不可撤销地删除空格。我的第一个想法是将spaces
表重命名为allspaces
,添加新列deleted
,并创建一个视图spaces
来代替旧表。该视图仅返回未删除的空格。我在spaces
视图上创建了三个允许INSERT,UPDATE和DELETE的规则。 DELETE规则只更改deleted
字段,从而将其从视图中删除,但所有数据都保留在数据库中。
现在问题是spaces
上的DELETE语句从PostgreSQL返回DELETE 0
。这导致Hibernate翻转并抛出异常并且Confluence爆炸。
无论如何都要修改PostgreSQL返回行而不是在INSTEAD规则上删除行。
答案 0 :(得分:1)
不确定这会扩展得多好(取决于你必须管理的空间数量),但我会定期将空间备份到XML。这可以通过API使用Confluence CLI:
轻松完成 confluence --action exportSpace --space "spaceName" --file "target/output/confluencecli/spaceName.xml"
您可以根据年龄轮换这些备份,并在用户删除空格时仅保留最新的备份。
为了更进一步,您可以修改实际删除空间的操作(confluence/spaces/removespace.vm
)并插入逻辑以将空间备份到XML,然后再确认删除。这样可以更好地扩展!
答案 1 :(得分:1)
您可以添加ON DELETE触发器,将已删除的行保存到存档表。您可以向应用程序添加救援功能以恢复已删除的行。
答案 2 :(得分:0)
我并不是真的想要实现你想要实现的目标,但也许你可以将delete语句放在一个返回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);