跟踪Postgresql数据库中的更改

时间:2018-02-14 09:34:58

标签: sql postgresql backend odoo

我正在使用Odoo(使用Postgresql数据库的ERP Web应用程序)。

在此软件中,我可以创建销售发票,采购订单,会计日记帐分录等。

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

2 个答案:

答案 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; ,以便在用户进行一些更改时,函数永远不会自行执行。