2011-11-28 71 views
1

我有興趣在現有的PostgreSQL數據庫中使用以下審計機制。使用PostgreSQL觸發器動態審計數據

http://wiki.postgresql.org/wiki/Audit_trigger

但是,想(如果可能的話),使一個修改。我還想將primary_key的值記錄在稍後可以查詢的地方。所以,我想在「logged_actions」表中添加一個名爲「record_id」的字段。問題是現有數據庫中的每個表都有一個不同的主鍵字段名。好消息是數據庫具有非常一致的命名約定。它總是,_id。所以,如果一個表名爲「employee」,那麼主鍵是「employee_id」。

有沒有辦法做到這一點?基本上,我需要OLD.FieldByName(x)或OLD [x]之類的東西來從id字段中獲取值,以便將其放入新審計記錄的record_id字段中。

我的確明白,我可以爲每個表格創建一個單獨的自定義觸發器,但我們希望將其保留爲通用的,這將非常好。

編輯:我也明白,鍵值不會記錄在舊/新數據字段中。但是,我希望能夠更簡單,更有效地查詢歷史。換句話說,

select * from audit.logged_actions where table_name = 'xxxx' and record_id = 12345; 

另一個編輯:我使用PostgreSQL 9.1

謝謝!

回答

1

你沒有提到你的PostgreSQL版本,這在寫這樣的問題的答案時非常重要。

如果你正在運行的PostgreSQL 9.0或更高版本(或能夠升級),您可以使用此方法,因爲記錄了帕維爾:

http://okbob.blogspot.com/2009/10/dynamic-access-to-record-fields-in.html

一般情況下,你想要的是引用一個動態命名字段在記錄類型的PL/PgSQL變量中,比如'NEW'或'OLD'。這在歷史上一直非常艱難,並且仍然很尷尬,但至少在9.0中可能。

您的其他替代方案 - 可能更簡單 - 將您的審計觸發器寫入plperlu,其中動態字段引用很平凡。

+0

感謝您的回覆並指出了這一點。我正在使用PostgreSQL 9.1(我已經更新了原始文章) –