跟踪 Postgresql 数据库中的更改

Track Changes in Postgresql Database

我正在研究 Odoo(一个使用 Postgresql 数据库的 ERP 网络应用程序)。

在这个软件中我可以创建销售发票、采购订单、会计分录等

当我从 UI 进行任何交易时,我需要知道数据库中发生了什么(更新了哪些表,哪些记录是 created/deleted 等)

您可以通过添加行(或更改它,如果存在)log_level=debug_sql.

在 odoo 配置中激活调试 sql 日志

您还可以更改 odoo.py 的 运行 参数。只需查看 the Odoo documentation 哪些参数是可能的。

在 PostgreSWL 中跟踪对 tables 所做更改的最简单方法是编写和使用通用 PL/pgSQL 函数。

假设您创建了一个 table 来存储历史记录:

CREATE SCHEMA logging;
CREATE TABLE logging.t_history (
id   serial,
tstamp   timestamp DEFAULT now(),
schemaname   text,
tabname   text,
operation   text,
who   text   DEFAULT current_user,
new_val   json,
old_val json
);

添加跟踪此更改的功能table:

CREATE FUNCTION change_trigger() RETURNS trigger AS $$
BEGIN
IF TG_OP = 'INSERT'
THEN
INSERT INTO logging.t_history (tabname, schemaname, operation, new_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
INSERT INTO logging.t_history (tabname, schemaname, operation, new_val, old_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP,
row_to_json(NEW), row_to_json(OLD));
RETURN NEW;
ELSIF TG_OP = 'DELETE'
THEN
INSERT INTO logging.t_history (tabname, schemaname, operation, old_val)
VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));
RETURN OLD;
END IF;
END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;

如果您使用此机制来跟踪更改,请确保更改数据的人不能在日志中进行更改。为确保这一点,将触发器函数标记为 ‘Security Definer’,这样当用户进行某些更改时,该函数永远不会自行执行。