2

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

现在的问题是从 PostgreSQLspaces返回时的 DELETE 语句。DELETE 0这会导致 Hibernate 跳出并抛出异常,Confluence 崩溃了。

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

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 回答