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



我们在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_explaincontrib模块。您必须启用它,设置auto_explain.log_nested_statements = onauto_explain.log_min_duration = 0。然后,所有语句,甚至是嵌套的语句,都将被记录下来,并记录它们的执行计划。

最新更新