Postgres Просмотр, после изменения таблицы для изменения имени таблицы, Просмотр по-прежнему запрашивает ее? - PullRequest
1 голос
/ 16 июня 2020

Используя Postgres базу данных. У меня есть существующая таблица и несколько существующих представлений, которые запрашивают эту таблицу. Назовите стол, «контакты».

Изменяю таблицу, меняя имя на «contacts_backup». Затем я создал новую таблицу с тем же именем, что и старая таблица, которая имела «контакты»

Теперь кажется, что если я запрашиваю существующие представления, данные по-прежнему извлекаются из переименованной таблицы, contacts_backup, а не новая таблица, «контакты».

Может такое быть? Как я могу обновить представления для запроса новой таблицы с тем же именем, а не переименованной таблицы contacts_backup?

Моя новая таблица на самом деле является сторонней таблицей, но разве принцип не должен быть таким же? Я ожидал, что существующие таблицы будут запрашивать новую таблицу, а не старую переименованную.

Каков эффективный способ обновить существующие представления для запроса из новой таблицы?

1 Ответ

2 голосов
/ 16 июня 2020

Это потому, что PostgreSQL сохраняет определение представления не как строку SQL, а как дерево анализируемых запросов.

Эти проанализированные деревья запросов не содержат имен объектов, на которые есть ссылки, но только их идентификатор объекта (oid), который не меняется при переименовании объекта. То же верно и для столбцов таблицы. Все это справедливо и для сторонних таблиц.

Когда вы исследуете определение представления, например, с помощью pg_get_viewdef, дерево синтаксического анализа отображается как текст, поэтому вы увидите измененные имена.

Если вы хотите изменить таблицу, на которую ссылается представление, единственным решением является либо DROP представление, и CREATE его снова, либо вы можете использовать CREATE OR REPLACE VIEW.

...