有通过pg_log来看,发现了删除的记录,但没有修改或新增的记录。
有试过在information_schema.columns加触发器,instead of,但是也不行。
大家有什么方法吗?
log_statement参数是用来指定记录哪些SQL语句的信息,包括ddl(数据定义语言)、mod(修改操作)和all(所有语句)。
-
可以通过在postgresql.conf文件中设置log_statement = 'all’来记录所有的SQL语句,包括增删改查等操作。
-
如果想要查看修改或新增的记录,可以通过在postgresql.conf文件中设置log_statement = 'mod’来记录。
-
另一种如果只想记录删除操作,可以设置log_statement = ‘ddl’。如果想要查看删除记录,可以在pg_log中查看。
DDL触发器可以在表结构变更时自动执行,从而记录相关信息。以下是一个创建DDL触发器的示例:
CREATE OR REPLACE FUNCTION log_ddl_changes()
RETURNS event_trigger AS $$
DECLARE
obj_data json;
BEGIN
obj_data := json_build_object(
'schema', tg_tag,
'object', tg_table_name,
'event', tg_event_tag,
'query', tg_current_query()
);
INSERT INTO ddl_log(data) VALUES(obj_data);
END;
$$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER ddl_trigger
ON ddl_command_end
EXECUTE FUNCTION log_ddl_changes();
这个触发器会在每次执行DDL语句(如CREATE、ALTER、DROP等)时触发,将相关信息以JSON格式记录到一个名为ddl_log的表中,可以根据自己的需要调整记录的内容和格式。
当如果只需要记录某个特定表的变动,可以在创建触发器时添加对应的表名和模式名限制,例如:
CREATE EVENT TRIGGER ddl_trigger
ON ddl_command_end
WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE', 'DROP TABLE')
AND schemaname = 'public'
AND objname = 'mytable'
EXECUTE FUNCTION log_ddl_changes();
这样,只有当public模式下的mytable表发生变动时,触发器才会被执行并记录变动信息。
评论
有用 1嗯嗯 试了下 可以的 多谢
event_trigger是9.3之后才有的,9.3之前的版本有办法记录吗?
评论
有用 0如果使用的是 PostgreSQL 9.3 之前的版本的话,可以尝试使用 log_statement 配置选项来记录所有的 DDL 语句。该选项可以记录所有的 DDL 语句,包括创建、修改和删除表、索引、视图、函数等对象的语句。
要启用 log_statement 选项,您需要在 postgresql.conf 文件中设置相应的参数值。例如想记录所有的 DDL 语句的话,就可以将 log_statement 设置为 all,如下所示:
log_statement = 'all'
还可以将 log_statement 设置为 mod 或 ddl,以记录修改和删除操作或仅记录 DDL 语句。要查看详细的语句信息,可以将 log_min_duration_statement 设置为零,以记录所有语句。
评论
有用 1
墨值悬赏

