可以在PostgreSQL中修改DELETE的返回值

时间:2010-05-17 21:31:01

标签: postgresql rules confluence

我试图阻止用户在Confluence wiki中不可撤销地删除空格。我的第一个想法是将spaces表重命名为allspaces,添加新列deleted,并创建一个视图spaces来代替旧表。该视图仅返回未删除的空格。我在spaces视图上创建了三个允许INSERT,UPDATE和DELETE的规则。 DELETE规则只更改deleted字段,从而将其从视图中删除,但所有数据都保留在数据库中。

现在问题是spaces上的DELETE语句从PostgreSQL返回DELETE 0。这导致Hibernate翻转并抛出异常并且Confluence爆炸。

无论如何都要修改PostgreSQL返回行而不是在INSTEAD规则上删除行。

3 个答案:

答案 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);