PostgreSQL中最新的表修改时间

Aka*_*ash 6 sql postgresql

我需要得到一个表的最新修改时间,所以遇到了

select relfilenode from pg_class where relname = 'test';
Run Code Online (Sandbox Code Playgroud)

它给了我relfilenode id,这似乎是一个目录名

L:\Databases\PostgresSQL\data\base\inodenumber
Run Code Online (Sandbox Code Playgroud)

我后来提取了最新的修改时间.

这是正确的方法,还是有更好的方法来做同样的事情

Cra*_*ger 5

测试表的relfilenode的mtime将无法正常工作.正如Eelke所指出的VACUUM,其他操作将修改时间戳.提示位设置也将修改表,使其看起来被a"修改" SELECT.此外,有时一个表有一个以上的磁盘关系(1GB块),你必须检查所有它们以找到最新的.

如果要保留表的上次修改时间,请添加一个AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ... FOR EACH STATEMENT触发器,用于更新用于跟踪修改时间的表中的时间戳行.

触发器的缺点是它会对桌面上的单行锁定进行竞争,因此它将序列化您的所有事务.它还会大大增加陷入僵局的可能性.你真正想要的可能是一些非事务不具备交易时的确,在那里如果多个事务更新计数器的最高值胜回滚.没有内置的东西,尽管它可能不像C扩展那么难.

稍微复杂的选项是创建一个触发器,用于dblink更新最后更新的计数器.这将避免大多数争用问题,但它实际上会使死锁更糟,因为PostgreSQL的死锁检测将无法"看到"两个会话通过中介死锁的事实.您需要一种SELECT ... FOR UPDATE超时的方法,使其可靠,而不会过于频繁地中止事务.

但无论如何,触发器不会捕获DDL.DDL触发器("事件触发器")将在第9.3页中出现.

也可以看看: