我正在使用Odoo(使用Postgresql数据库的ERP Web应用程序)。
在此软件中,我可以创建销售发票,采购订单,会计日记帐分录等。
当我从UI进行任何交易时,我需要知道数据库中发生了什么(更新了哪些表,创建/删除了哪些记录等)。
答案 0 :(得分:0)
您可以通过添加行来激活odoo配置中的调试sql日志(如果现有的话,可以更改它)log_level=debug_sql
。
您还可以更改odoo.py的运行参数。只需查看the Odoo documentation哪些参数可能。
答案 1 :(得分:0)
跟踪PostgreSWL中对表所做更改的最简单方法是编写和使用通用的PL / pgSQL函数。
假设您创建了一个用于存储历史记录的表:
resource "aws_instance" "instance" {
...
...
}
resource "aws_route53_record" "instance_dns_a" {
count = "${var.num_instances}"
zone_id = "${var.internal_zone_id}"
# New line but we want the parsed version
name = "${aws_instance.instance.id}"
# old that works
name = "${format(prod-${service_name}-%03d", count.index + 1)}"
}
添加用于跟踪此表中更改的函数:
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
);
如果您使用此机制来跟踪更改,请确保更改数据的人无法在日志中进行更改。为了确保这一点,将触发器标记为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;
,以便在用户进行一些更改时,函数永远不会自行执行。