跟踪 Postgresql 数据库中的更改

Eha*_*hab 3 sql postgresql backend odoo

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

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

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

小智 7

跟踪 PostgreSQL 中表的更改的最简单方法是编写和使用通用 PL 或 pgSQL 函数。

\n

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

\n
CREATE SCHEMA logging;\nCREATE TABLE logging.t_history (\nid   serial,\ntstamp   timestamp DEFAULT now(),\nschemaname   text,\ntabname   text,\noperation   text,\nwho   text   DEFAULT current_user,\nnew_val   json,\nold_val json\n);\n
Run Code Online (Sandbox Code Playgroud)\n

添加一个函数来跟踪此表中的更改:

\n
CREATE FUNCTION change_trigger() RETURNS trigger AS $$\nBEGIN\nIF TG_OP = 'INSERT'\nTHEN\nINSERT INTO logging.t_history (tabname, schemaname, operation, new_val)\nVALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));\nRETURN NEW;\nELSIF TG_OP = 'UPDATE'\nTHEN\nINSERT INTO logging.t_history (tabname, schemaname, operation, new_val, old_val)\nVALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP,\nrow_to_json(NEW), row_to_json(OLD));\nRETURN NEW;\nELSIF TG_OP = 'DELETE'\nTHEN\nINSERT INTO logging.t_history (tabname, schemaname, operation, old_val)\nVALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));\nRETURN OLD;\nEND IF;\nEND;\n$$ LANGUAGE 'plpgsql' SECURITY DEFINER;\n
Run Code Online (Sandbox Code Playgroud)\n

如果您使用此机制来跟踪更改,请确保更改数据的人无法在日志中进行更改。为了确保这一点,将触发器函数标记为\xe2\x80\x98Security Definer\xe2\x80\x99以便当用户进行某些更改时该函数永远不会自行执行。

\n