【问题标题】:Can the return value of DELETE be modified in PostgreSQLPostgreSQL中可以修改DELETE的返回值吗
【发布时间】:2010-05-17 21:31:01
【问题描述】:

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

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

无论如何让 PostgreSQL 返回行修改而不是根据 INSTEAD 规则删除的行。

【问题讨论】:

  • 为什么您的用户可以直接访问 Confluence 表?!
  • 他们没有,Confluence 在“删除空间”中有一个按钮,可以从数据库中删除空间。目前这是永久性的,恕我直言,这是非常反维基的。我正在尝试在数据库级别解决此问题。

标签: postgresql rules confluence


【解决方案1】:

不确定这将如何扩展(取决于您必须管理的空间数量),但我会定期将空间备份到 XML。这可以通过 API 使用Confluence CLI 轻松完成:

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

您可以根据时间轮换这些备份,并在用户删除空间的情况下仅保留最新的备份。

为了更进一步,您可以修改实际删除空间的操作 (confluence/spaces/removespace.vm),并在确认删除之前插入将空间备份到 XML 的逻辑。这会更好地扩展!

【讨论】:

  • 不幸的是,我们有几千个空间,因此计划导出是不可行的,但我确实喜欢劫持删除空间操作的想法。
【解决方案2】:

您可以添加一个 ON DELETE 触发器,将删除的行保存到存档表中。您可以在应用程序中添加救援功能来恢复已删除的行。

【讨论】:

  • 是的,这也是我的第一次尝试,虽然这与我的规则的效果相同,但方向相反,单行删除返回两行修改,Hibernate 抛出异常。
  • 我不敢相信Hibernate不允许在数据库中使用触发器,一定有一个选项!
  • 是的,Hibernate 允许这样做,但这是代码更改。整个问题在于这是一个闭源产品。
【解决方案3】:

我并没有真正遵循您想要实现的目标,但也许您可以将删除语句放在返回 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);  

【讨论】:

    猜你喜欢
    • 2019-08-24
    • 2017-08-17
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多