跟踪 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’
,这样当用户进行某些更改时,该函数永远不会自行执行。
我正在研究 Odoo(一个使用 Postgresql 数据库的 ERP 网络应用程序)。
在这个软件中我可以创建销售发票、采购订单、会计分录等
当我从 UI 进行任何交易时,我需要知道数据库中发生了什么(更新了哪些表,哪些记录是 created/deleted 等)
您可以通过添加行(或更改它,如果存在)log_level=debug_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’
,这样当用户进行某些更改时,该函数永远不会自行执行。