我需要得到一个表的最新修改时间,所以遇到了
select relfilenode from pg_class where relname = 'test';
它给了我relfilenode id,这似乎是一个目录名
L:\Databases\Postgressql\data\base\inodenumber
测试表的relfilenode的mtime将无法正常工作.正如Eelke所说,VACUUM和其他操作将修改时间戳.提示位设置也将修改表,使其看起来被SELECT“修改”.此外,有时一个表有一个以上的磁盘关系(1GB块),你必须检查所有它们以找到最新的.
如果要保留表的上次修改时间,请添加AFTER INSERT或UPDATE或DELETE OR TruncATE … FOR EACH STATEMENT触发器,用于更新用于跟踪修改时间的表中的时间戳行.
触发器的缺点是它会对桌面上的单行锁定进行竞争,因此它将序列化您的所有事务.它还会大大增加陷入僵局的可能性.你真正想要的可能是非事务性的东西,当事务发生时不需要回滚,如果多个事务更新计数器,则最高值获胜.没有内置的东西,尽管它可能不像C扩展那么难.
稍微复杂一点的选择是创建一个触发器,使uses dblink
更新最后更新的计数器.这将避免大多数争用问题,但它实际上会使死锁更糟,因为Postgresql的死锁检测将无法“看到”两个会话通过中介死锁的事实.你需要一种方法来SELECT … FOR UPDATE超时,以使其可靠而不会过于频繁地中止事务.
但无论如何,触发器不会捕获DDL. DDL触发器(“事件触发器”)将在第9.3页中出现.
也可以看看:
> How do I find the last time that a PostgreSQL database has been updated?
> How to get ‘last modified time’ of the table in postgres?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。