Совсем недавно мой PostgreSQL 8.2.4 регистрирует такие ошибки:
ERROR: could not open relation with OID nnnnnnnnn
CONTEXT: SELECT a,b,c FROM table_C
Ошибка всегда вызывается одним и тем же сценарием: обновление таблицы A вызывает срабатывание триггера, который вставляет данные в таблицу B, который запускает другой триггер, который (среди прочего) выбирает в таблице C. Этот выбор затем в таблице С указывается КОНТЕКСТ проблемы, описанной выше. Последовательность запросов, приводящих к появлению сообщения об ошибке, выполняется каждый день, и каждый день жалуется на отсутствие одного и того же OID.
Вполне естественно OID, упомянутый в сообщении об ошибке, не существует при запросе pg_class. Выполнение проблемного SQL (то есть выбор в таблице C) не вызывает никаких проблем. Я попытался выяснить OID и соединения между всеми задействованными таблицами, чтобы выяснить, где находится эта ссылка на несуществующий OID, но мне не удалось. Я начал с таблицы A и получил ее OID (pg_class.reltype) и убедился, что к ней подключен триггер. Проблемы начинаются, когда я запрашиваю pg_trigger, используя pg_trigger.tgrelid = pg_class.reltype в качестве условия. Запрос выдает 0 строк, но когда я запрашиваю таблицы только по relname / tgname, я получаю разные OID, точно так же, как триггер находится в другой таблице. Я провел быструю проверку, и оказалось, что создание простой таблицы с триггером приводит к тому же результату.
Итак, мои вопросы:
Как мне перемещаться по таблицам pg_trigger (и другим таблицам pg, таким как pg_attribute, pg_shdepend), когда я могу найти таблицу в pg_class?
Если мне как-то удается найти ссылку на проблемный OID, могу ли я просто удалить ссылку, выполнив прямые обновления / удаления в таблицах pg_class?