2017-06-02 32 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

而不是負擔表中刪除的行,添加審計每當使用觸發器刪除導入時記錄表。這個表格可以在需要時清除和截斷,並且不會給應用程序帶來負擔。