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

3

我们在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'一样。
现在我找到了一些相关的主题,但它们都依赖于手动创建审计表或使用RAISE手动记录(像这个链接Log firing of triggers in postgres 9.1中的例子)。
  • 我如何在不使用手动(容易出错的)代码的情况下启用对触发器/函数执行的查询的日志记录?

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

1个回答

4

log_statement 只会记录顶层语句,也就是客户端发送的语句。嵌套语句不会被记录。

记录这些语句的一种方法是使用 auto_explain 贡献模块。您需要启用它,并设置 auto_explain.log_nested_statements = onauto_explain.log_min_duration = 0。然后所有语句,甚至嵌套的语句,都将被记录,并附带它们的执行计划。


感谢Laurenz-Albe提供的指针!现在我确实获得了日志输出,但是使用变量而不是值。 INSERT INTO misc.object_types (uuid, object_type_schema, object_type_table, label) VALUES (NEW.uuid, TG_TABLE_SCHEMA, TG_TABLE_NAME, NEW.label) ON CONFLICT DO NOTHING 有什么办法可以进一步深入了解吗?我想看到写入数据库的值,而不是变量名_NEW.uuid_(我确认在数据库中有一个值)。我在EXPLAIN和AUTO_EXPLAIN中都找不到开关。 - Dietmar Schneider
更多的话,你需要在你的代码中添加RAISE NOTICE来输出数据。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接