postgresql - 使用 PostgreSQL 触发器对数据进行动态审计

标签 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

谢谢!

最佳答案

您没有提到您的 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 中编写您的审计触发器,其中动态字段引用是微不足道的。

关于postgresql - 使用 PostgreSQL 触发器对数据进行动态审计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301136/

相关文章:

postgresql - 解析 PgAttribute 和 Where 条件子句

postgresql - 将 SAS 9.2 与 Amazon Redshift 连接

MySql Stored Procedure如何处理?

mysql - 无法在 phpmyadmin 的 mysql 中创建触发器

oracle - 如何使用 EXECUTE IMMEDIATE 获取记录?

sql - 如何在现有位置插入新行之前更新唯一的表行号

postgresql - 'service postgresql start' 无法在 Fedora 上启动 postgres 服务

mysql - 在不写入二进制日志的情况下运行触发器

sql-server - 使用参数添加列?

c# - 如何在 C# 中从 Datatable 动态构建插入命令