Замініть матеріалізований вигляд у Postgres


23

У мене матеріалізований вигляд, Postgres 9.3який я хотів би оновити новими колонками. Однак інші матеріалізовані представлення також залежать від цього подання, і повідомлення про помилку вказує на те, що видалення подання неможливо, коли від нього залежать інші об'єкти.

ПОМИЛКА: не вдається відмовитись від матеріалізованого перегляду latest_charges, оскільки від цього залежать інші об'єкти

З документації також видно, що ключове слово REPLACE недійсне для матеріалізованого перегляду. Чи є якась комбінація ярликів, щоб відкинути всі залежні об'єкти та відновити кожен з них?


7
На жаль, я думаю, що ти зациклювався на тому, щоб кинути їх і відновити.
Крейг Рінгер

@CraigRinger зацікавлений, щоб додати це як відповідь?
dezso

Відповіді:


17

Станом на PostgreSQL 9.4: На відміну від документації CREATE VIEW , документація CREATE MATERIALIZED VIEW НЕ згадує ключове слово ЗАМІНА. Здається, немає жодного ярлика в сторону від відкидання всіх залежних об'єктів та відновлення кожного з них.

Коли ви це зробите, я можу порекомендувати лише дві дрібниці:

  1. Використовуйте DROP MATERIALIZED VIEW blabla CASCADE, щоб отримати список усіх залежних об'єктів
  2. Зробіть падіння та відтворення всіх залежних об’єктів за одну транзакцію.

1
Дякую, саме так я це робив. Це просто боліти прямо, оскільки я будую один базова матеріалізований погляд для аналітичних цілей, який повторно використовується у багатьох інших поглядах. Цей базовий вигляд рідко змінюється, але ті, що залежать від нього, змінюються щодня.
Іван

4

У моїй ситуації я вважаю за краще обмежувати краплі, використовуючи шар перегляду:

  1. Створіть копію матеріалізованого представлення з суфіксом "_new", а також використовуйте "AND 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

Мені не ясно в останніх двох кроках. Чи 4 речення, яке складається з 5? ви могли б зробити короткий приклад з деякими назвами matviews та view?
kimbo305

виправив усічене речення та додав приклад
RuiDC

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.