我们在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不同?
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 SchneiderRAISE NOTICE
来输出数据。 - Laurenz Albe