参照完整性:删除所有子项但不删除父项[PostgreSQL]

时间:2017-06-02 13:58:25

标签: postgresql triggers referential-integrity

我有一个imports表,其中包含有关已完成的文件导入的信息:idimport(SERIAL PRIMARY KEY),文件名,导入日期等。

有几个表格有一个字段idimport INTEGER REFERENCES imports(idimport) ON DELETE CASCADE

To" unmport"一个文件,我所要做的就是删除imports表中的行。

我面临的问题是,有些用户告诉我他们肯定导入了一个文件,但没有找到导入数据的痕迹。通常,他们没有导入文件并忘记重新导入它,但我没有证明(除了缺少idimport远远不够)。

所以我想跟踪已删除的导入。理想情况下,我希望PostgreSQL删除所有子行,保留父行(imports)行,并将该行标记为已删除,删除它的用户以及删除时(可能是删除)。

我在这里的想法是创建一个ON DELETE触发器来记住"有趣的" imports表中的字段,让删除操作运行并重新创建一个imports行,其中包含有趣的字段(包括idimport)和我要添加的字段。

但我想要两个"之前" (记忆)和""" (重新创建行)动作,这将是两个触发器,我不知道如何让它们进行通信(有趣的领域)。

当然,我可以做客户端或创建存储过程,但我更喜欢完全集成的解决方案(使用DELETE FROM imports WHERE idimport=12

1 个答案:

答案 0 :(得分:0)

添加一个审计表,用于记录每次使用触发器删除导入时,而不是使表中包含已删除的行。这个表可以在必要时轻松清除和截断,不会给您的应用带来负担。