0

最近我的团队遇到了一种情况,我们共享的测试数据库中的一些记录没有明确的原因消失了。因为它是一个共享数据库(被很多团队使用),所以我们无法追踪它是编程错误还是有人运行了一个错误的 sql 脚本。

所以我正在寻找一种方法来通知(在数据库级别)特定表 A 的一行被删除时。我查看了 Postgres TRIGGER,但它没有给我导致删除的特定 sql。

无论如何我可以记录导致删除表A中某些行的sql语句吗?

4

2 回答 2

2

你可以使用这样的东西

它允许您为 PostgreSQL 表创建一个特殊的触发器,记录对所选表的所有更改。

此触发器可以记录导致更改的查询(通过current_query())。

以此为基础,您可以添加更多字段/信息来记录。

于 2012-12-27T14:09:47.953 回答
1

您将对实际的 postgres 配置文件执行此操作:

http://www.postgresql.org/docs/9.0/static/runtime-config-logging.html

log_statement(枚举)

Controls which SQL statements are logged. Valid values are none (off), ddl, mod, and all (all statements). ddl logs all data

定义语句,例如 CREATE、ALTER 和 DROP 语句。mod 记录所有 ddl 语句,以及数据修改语句,例如 INSERT、UPDATE、DELETE、TRUNCATE 和 COPY FROM。如果 PREPARE、EXECUTE 和 EXPLAIN ANALYZE 语句包含的命令属于适当的类型,则它们也会被记录。对于使用扩展查询协议的客户端,当接收到 Execute 消息时发生日志记录,并且包含 Bind 参数的值(任何嵌入的单引号加倍)。

The default is none. Only superusers can change this setting.

您希望 ddl 或 all 成为选择。这是您需要更改的内容:
在您的data/postgresql.conf文件中,将log_statement设置更改为“全部”。此外,可能还需要验证以下内容:

1) make sure you have turned on the log_destination variable
2) make sure you turn on the logging_collector
3) also make sure that pg_log actually exists relative to your data directory, and that the postgres user can write to it.

取自这里

于 2012-12-27T13:57:24.037 回答