2010-07-06 69 views
6

我們在PostgreSQL上實現了一個使用Java/Spring/Hibernate的新系統。一旦對錶格中的記錄進行了修改/刪除,該系統需要製作每個記錄的副本。稍後,報告將查詢審計表以向用戶顯示數據。如何在PostgreSQL上實現對錶修改的審計/版本化

我打算通過在表上創建一個觸發器來實現這種審計/版本控制功能,該功能會將修改後的行(刪除行)的副本「TO」複製到名爲ENTITY_VERSIONS的TABLE中,該表具有大約20列稱爲col1,col2,col3,col4等,它們將存儲上表中的列; 但是,問題是如果有超過1個表被版本化並且只有1個TARGET表(ENTITY_VERSIONS)存儲所有表的版本,那麼我如何設計TARGET表?

或者更好的是,每個需要版本控制的表都會有一個版本表的COPY?

如果可以共享用於實現審計/版本控制的PostgreSQL觸發器(和相關存儲過程)代碼的某些指針,那將是獎金。

P.S:我看着Suggestions for implementing audit tables in SQL Server?有點像答案,除了我不知道OldValue和NewValue是什麼類型?

P.P.S:如果表格使用SOFT DELETE(幻影刪除)而不是HARD刪除,那麼您的建議是否改變?

回答

4

我希望每個表都有一個表格的副本來保存您希望保留的表格的版本。這聽起來像是維護和使用全局版本表的一個噩夢。

This link在Postgres文檔中顯示了Postgres中的一些審計觸發器示例。

+0

+1 謝謝。 我想知道擁有「GLOBAL審計表」與「每個表的審計表」的優點是什麼w.r.t查詢報告數據? – anjanb 2010-07-07 12:30:30

+1

如果你以某種方式設法擁有GLOBAL審計表,我預見ALOT的類型轉換。我的意思是......你會將所有列存儲在什麼類型中? – rfusca 2010-07-07 16:44:58

+0

rfusca:對。是的,那也是我的懷疑! – anjanb 2010-07-08 06:32:33

2

在全局表中,所有列都可以作爲hstore類型存儲在單列中。我只是嘗試審計,我認爲它很棒,我推薦它。令人敬畏的審計表示例通過簡單地將觸發器添加到要開始保留審計歷史記錄的表上來跟蹤單個表中的所有更改。所有更改存儲爲hstore類型 - 作品v 9.1+ this link

相關問題