Заменить материализованное представление в Postgres

23

У меня есть материализованное представление, Postgres 9.3которое я хотел бы обновить новыми столбцами. Однако другие материализованные представления также зависят от этого представления, и сообщение об ошибке указывает, что удаление представления невозможно, когда другие объекты зависят от него.

ОШИБКА: невозможно отбросить материализованное представление latest_charges, потому что другие объекты зависят от него

Из документации также следует, что ключевое слово REPLACE недопустимо для материализованного представления. Есть ли какой-нибудь ярлык, кроме удаления всех зависимых объектов и восстановления каждого из них?

Джон
источник
7
К сожалению, я думаю, что вы застряли, бросив их все и восстановив.
Крейг Рингер
@CraigRinger заинтересован в добавлении этого в качестве ответа?
Дезсо

Ответы:

17

Начиная с PostgreSQL 9.4: В отличие от документации CREATE VIEW , в документации CREATE MATERIALIZED VIEW НЕ упоминается ключевое слово REPLACE. Кажется, нет никакого сокращения, кроме отбрасывания всех зависимых объектов и восстановления каждого из них.

Когда вы делаете это, я могу рекомендовать только две маленькие вещи:

  1. Используйте DROP MATERIALIZED VIEW blabla CASCADE, чтобы получить список всех зависимых объектов
  2. Сделайте сброс и воссоздание всех зависимых объектов в одной транзакции.
alfonx
источник
1
Спасибо, именно так я и делал. Это просто боль, чтобы быть прямым, так как я строю одно базовое материализованное представление для аналитических целей, которое повторно используется во многих других представлениях. Это базовое представление редко меняется, но те, которые зависят от него, меняются ежедневно.
Джон
4

В моей ситуации я предпочитаю ограничивать количество отбрасываний, используя слой вида:

  1. Создайте копию материализованного представления с суффиксом «_new», а также используйте «WITH NO DATA» для производительности, убедитесь, что все индексы также созданы с суффиксом, а также любые другие зависимые объекты, обнаруженные с помощью DROP ... CASCADE
  2. Создайте представление для нового материализованного представления, чтобы обеспечить уровень абстракции, поэтому мне нужно изменить его только в одном месте.
  3. ИЗМЕНИТЕ существующие зависимости, чтобы вместо этого ссылаться на новое представление (обновляя данные при необходимости заранее)
  4. Отбросьте исходное материализованное представление и индексы, которые теперь не должны иметь никаких зависимостей.
  5. ИЗМЕНИТЬ материализованное представление и индексы, чтобы удалить суффикс для восстановления оригинальных имен

например.

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready
RuiDC
источник
Я не совсем понимаю эти последние два шага. Является ли 4 предложение, которое идет в 5? Не могли бы вы сделать быстрый пример с некоторыми именованными matviews и views?
kimbo305
исправил усеченное предложение и добавил пример
RuiDC
1

В PgAdmin (версия 4.x) я мог легко изменить определение (я добавил предложение where) в окне свойств. Ваша проблема может быть решена таким образом.

user2953022
источник