PostgreSQL 日志 trigger/function 查询数据
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 文件中确实显示 trigger/function 已执行。但我对包含所有值的实际 SQL 语句感兴趣,就像 log_statement= 'mod'
现在我在这里找到了一些主题,但它们都依赖于手动创建一个 audit table
或使用 RAISE
手动记录(比如这个 Log firing of triggers in postgres 9.1)。
如何在没有手动(容易出错的)代码的情况下启用对 triggers/functions 执行的查询的记录?
更重要的是:为什么 triggers/functions 的处理方式与常规查询不同?这是否也意味着触发器调用的 INSERT 与手动 INSERT 不同?
log_statement
将只记录顶级语句,即客户端发送的语句。不记录嵌套语句。
记录这些的一种方法是使用 auto_explain
contrib 模块。您必须启用它,设置 auto_explain.log_nested_statements = on
和 auto_explain.log_min_duration = 0
。然后所有的语句,甚至是嵌套的语句,连同它们的执行计划都会被记录下来。
我们在 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 文件中确实显示 trigger/function 已执行。但我对包含所有值的实际 SQL 语句感兴趣,就像 log_statement= 'mod'
现在我在这里找到了一些主题,但它们都依赖于手动创建一个 audit table
或使用 RAISE
手动记录(比如这个 Log firing of triggers in postgres 9.1)。
如何在没有手动(容易出错的)代码的情况下启用对 triggers/functions 执行的查询的记录?
更重要的是:为什么 triggers/functions 的处理方式与常规查询不同?这是否也意味着触发器调用的 INSERT 与手动 INSERT 不同?
log_statement
将只记录顶级语句,即客户端发送的语句。不记录嵌套语句。
记录这些的一种方法是使用 auto_explain
contrib 模块。您必须启用它,设置 auto_explain.log_nested_statements = on
和 auto_explain.log_min_duration = 0
。然后所有的语句,甚至是嵌套的语句,连同它们的执行计划都会被记录下来。