2017-06-02 33 views
0

我有一个imports表包含完成的文件导入信息:idimport(SERIAL PRIMARY KEY),文件名,进口日期等参照完整性:删除所有孩子,但不是父[PostgreSQL的]

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

要“取消导入”文件,我所要做的就是删除imports表中的行。

我面临的问题是,有些用户告诉我他们肯定导入了一个文件,但没有找到导入数据的踪迹。通常情况下,他们没有进口该文件,忘记重新进口,但我没有证据证明(除了丢失的idimport这远远不够)。

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

的想法,我这里是创建一个ON DELETE触发器会记住在imports表中的“有趣”的领域,让删除操作运行,并与感兴趣的领域(包括idimport)和那些重新创建imports行我想补充。但我希望“之前”(记忆)和“之后”(重新创建行)动作都是两个触发器,我不知道如何让它们进行通信(有趣的领域)。

当然,我既可以做客户端,或者创建一个存储过程,但我更喜欢一个完全集成的解决方案(与DELETE FROM imports WHERE idimport=12工作)

+1

您可以通过'old'记录(不需要记住任何内容)在'after'触发器中访问整个删除的行 – pozs

+0

我可能会使用新的单独表格来归档已删除的行。这可以通过一个简单的触发器来实现。 – klin

+1

您正在寻找审计触发器。见[这里](https://eager.io/blog/audit-postgres/)或[这里](https://www.garysieling.com/blog/auditing-data-changes-postgres)或[这里]( https://wiki.postgresql.org/wiki/Audit_trigger_91plus)或[这里](http://okbob.blogspot.de/2015/01/most-simply-implementation-of-history.html)或[这里]( http://8kb.co.uk/blog/2015/01/19/copying-pavel-stehules-simple-history-table-but-with-the-jsonb-type/) –

回答

0

而不是负担表中删除的行,添加审计每当使用触发器删除导入时记录表。这个表格可以在需要时清除和截断,并且不会给应用程序带来负担。