暂无图片
请问有什么办法 能及时记录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
打赏 0
手机用户2162

嗯嗯 试了下 可以的 多谢

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

暂无图片 评论
暂无图片 有用 0
打赏 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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
pgxc和pgxl架构特征以及区别是什么?
回答 1
pgxl是由pgxc演化而来的,其功能和性能都得到了增强,相比pgxc,pgxl稳定性更好,适用场景更丰富。
在PostgreSQL数据库,如果postgresql.conf参数文件中logging_collect设置为“on”,那么SysLogger辅助进程会收集哪些进程的stderr输出?
回答 1
已采纳
选ABCDAPostmaster进程BAutoVacuum辅助进程CWalWriter辅助进程D服务进程
PostgreSQL cume_dist() 函数如何使用?
回答 6
已采纳
PostgreSQLcumedist()函数PostgreSQL cumedist() 函数返回当前行的累积分布,即从第一行到与当前行值相同的最后一行的行数在分区内的总行数中的占比
pg应该选什么版本
回答 2
已采纳
用最新的14吧。可以信赖
在pg数据库中以下哪些SQL可以创建用户?不能选ROLE吧
回答 3
已采纳
选择AD吧login的意思是赋予角色拥有连接数据库权限,createuser默认带有登录权限,createrole没有所以需要声明login进行权限服务;也可以理解为CREATEROLEnameLOG
在PG数据库中以下哪个查看时间的SQL语句不会显示出时区信息?
回答 5
已采纳
Cselectcurrentdate;
pg中如何查看语句中的绑定变量的值
回答 1
已采纳
打开数据库参数logstatements,然后从数据库日志可以看到。
pg 有什么工具或许办法可以查询历史top sql 吗?
回答 2
已采纳
可以用pgstatstatements插件来查找最耗费资源的SQL(TopSQL)。这个插件可以记录所有执行过的SQL语句,包括执行时间、执行次数、I/O、CPU等等。实现命令:CREATEEXTEN
pg json_build_array函数使用方法?
回答 1
已采纳
PostgreSQL jsonbuildarray() 函数从可变的参数列表中创建一个可能是异构类型的JSON数组并返回。此函数与 jsonbbuildarray()&n
pg数据库jsonb_set()用法?
回答 5
已采纳
这是PostgreSQL jsonbset() 函数的语法:jsonbset(targetJSONB,pathTEXT[],newvalueJSONB[,createifmissi