暂无图片
请问有什么办法 能及时记录pg表结构的变动
我来答
分享
手机用户2162
2023-04-21
请问有什么办法 能及时记录pg表结构的变动

有通过pg_log来看,发现了删除的记录,但没有修改或新增的记录。

有试过在information_schema.columns加触发器,instead of,但是也不行。

大家有什么方法吗?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
Zixin Huo

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
手机用户2162

嗯嗯 试了下 可以的 多谢

event_trigger是9.3之后才有的,9.3之前的版本有办法记录吗?

暂无图片 评论
暂无图片 有用 0
Zixin Huo

如果使用的是 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
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏