我需要得到一个表的最新修改时间,所以遇到了
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?