繁体   English   中英

PostgreSQL 日志触发/函数查询数据

[英]PostgreSQL log trigger/function query data

我们在 SQL 查询(约 200 个触发器)中有业务逻辑,它补充了我们的应用程序代码。 并且我们有一些错误 - 为了找到它们,我想查看所有更改数据库中任何内容的事务(而不是手动检查 40 个表)。

我们通过设置启用登录/etc/postgresql/10/main/postgresql.conf

log_statement = 'mod' # none, ddl, mod, all

这会正确记录来自应用程序的所有 INSERT/DELETE/UPDATE 语句,如下所示:

INSERT INTO misc.object_types (uuid, object_type_schema, object_type_table) VALUES 'e49fcebd-e8f4-4ca4-b664-e7194685ae3f', 'gis', 'lines')

但不会记录 SQL 函数执行的操作。 环境

track_functions = all # none, pl, all

在 conf 文件中确实显示了触发器/函数已执行。 但我对具有所有值的实际 SQL 语句感兴趣,就像log_statement= 'mod'

现在我在这里找到了一些主题,但它们都依赖于手动创建audit table或使用RAISE手动记录(例如在 postgres 9.1 中触发触发器的日志)。

  • 如何在没有手动(容易出错)代码的情况下启用由触发器/函数执行的查询的日志记录?

  • 更重要的是:为什么触发器/函数的处理方式与常规查询不同? 这是否也意味着触发器调用的 INSERT 与手动 INSERT 不同?

log_statement将仅记录顶级语句,即客户端发送的语句。 不记录嵌套语句。

记录这些的一种方法是使用auto_explain contrib 模块。 您必须启用它,设置auto_explain.log_nested_statements = onauto_explain.log_min_duration = 0 然后将记录所有语句,甚至是嵌套语句,以及它们的执行计划。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM