就在最近我的PostgreSQL 8.2.4日志这种错误的原因:跟踪“可以与OID不开关系”错误
ERROR: could not open relation with OID nnnnnnnnn
CONTEXT: SELECT a,b,c FROM table_C
错误总是引起同样的情形:更新表A的原因触发器触发,它将数据插入表B,触发另一个触发器(在许多其他事物中)在表C上选择。然后,表C上的选择将作为上述问题的CONTEXT报告。导致错误消息出现的查询序列每天都会执行,并且每天都会报告缺少相同的OID。
很自然,在查询pg_class时,错误消息中提到的OID不存在。执行有问题的SQL(即在表C上选择)不会导致任何问题。我试图弄清楚所涉及的所有表之间的OID和连接,以找出对不存在的OID的引用,但我失败了。我从表A开始,得到了它的OID(pg_class.reltype)并进行了验证,它附带了触发器。当我使用pg_trigger.tgrelid = pg_class.reltype作为条件查询pg_trigger时,问题就开始了。该查询yelds 0行,但是当我查询表只是通过relname/tgname我得到不同的OID,就像触发器在不同的表上。我做了一个快速测试,看来,创建一个带有触发器的简单表格会产生相同的结果。
所以我的问题是:
如何浏览pg_trigger(和其他PG表像pg_attribute里,pg_shdepend)表时,我可以在pg_class里找到表?
如果以某种方式设法找到有问题的OID的引用,我可以通过在pg_class表上直接更新/删除来简单地删除引用吗?
版本8.2.4已经很老了,已经过时了,你(此时)16个补丁后面:8.2.20是最新的。这是4年没有任何维护... Digg到所有的发布说明,看看这个问题是否已经修复。 – 2011-02-17 15:17:48