【发布时间】:2019-12-18 18:11:03
【问题描述】:
最近我的 PostgreSQL 8.2.4 记录了这样的错误:
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 时,问题就开始了。该查询产生 0 行,但是当我仅通过 relname/tgname 查询表时,我得到不同的 OID,就像触发器在不同的表上一样。我做了一个快速测试,似乎创建一个带有触发器的简单表会产生相同的结果。
所以我的问题是:
当我可以在 pg_class 中找到表时,如何导航 pg_trigger(以及其他 pg 表,如 pg_attribute、pg_shdepend)表?
如果我设法找到了对有问题的 OID 的引用,我是否可以安全地通过对 pg_class 表进行直接更新/删除来简单地删除该引用?
【问题讨论】:
-
版本 8.2.4 非常旧且过时,您(此时)落后了 16 轮补丁:8.2.20 是最新的。那是 4 年没有任何维护...深入研究所有发行说明,看看这个问题是否已得到修复。
标签: postgresql