使用PostgreSQL触发器动态审核数据

时间:2011-11-28 19:24:24

标签: postgresql triggers dynamic-sql plpgsql

我有兴趣在现有的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 个答案:

答案 0 :(得分:1)

你没有提到你的PostgreSQL版本,这在写这样的问题的答案时非常重要。

如果您正在运行PostgreSQL 9.0或更高版本(或能够升级),您可以使用Pavel记录的这种方法:

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

通常,您想要的是在记录类型的PL / PgSQL变量(如“NEW”或“OLD”)中引用动态命名的字段。这在历史上一直很烦人,但仍然很尴尬,但至少在9.0中是可能的。

您的另一种选择 - 可能更简单 - 是在plperlu中编写审计触发器,其中动态字段引用很简单。