Reemplazar una vista materializada en Postgres

23

Tengo una vista materializada en la Postgres 9.3que me gustaría actualizar con nuevas columnas. Sin embargo, otras vistas materializadas también dependen de esta vista, y el mensaje de error indica que no es posible soltar una vista cuando otros objetos dependen de ella.

ERROR: no se puede descartar la vista materializada latest_charges porque otros objetos dependen de ella

También se deduce de la documentación que la palabra clave REPLACE no es válida para una vista materializada. ¿Hay algún atajo aparte de soltar todos los objetos dependientes y reconstruir cada uno?

John
fuente
77
Lamentablemente, creo que estás estancado con dejarlos caer y reconstruirlos.
Craig Ringer
¿@CraigRinger está interesado en agregar esto como respuesta?
dezso

Respuestas:

17

A partir de PostgreSQL 9.4: a diferencia de la documentación de CREATE VIEW , la documentación de CREATE MATERIALIZED VIEW NO menciona la palabra clave REPLACE. Parece que no hay atajos aparte de soltar todos los objetos dependientes y reconstruir cada uno.

Cuando lo haga, solo puedo recomendar dos cosas pequeñas:

  1. Use DROP MATERIALIZED VIEW blabla CASCADE para obtener una lista de todos los objetos dependientes
  2. Realice la caída y recreación de todos los objetos dependientes en una transacción.
alfonx
fuente
1
Gracias, así es exactamente como lo he estado haciendo. Es difícil mantenerse en línea, ya que estoy construyendo una vista materializada base para fines analíticos que se reutiliza en muchas otras vistas. Esa vista base rara vez cambia, pero las que dependen de ella cambian a diario.
John
4

Para mi situación, prefiero limitar las gotas usando una capa de vista:

  1. Cree una copia de la vista materializada con el sufijo "_new" y también use "SIN DATOS" para el rendimiento, asegúrese de que los índices también se crean con sufijo y cualquier otro objeto dependiente descubierto a través de DROP ... CASCADE
  2. Cree una vista sobre la nueva vista materializada para proporcionar la capa de abstracción, por lo que solo necesito cambiarla en un lugar
  3. ALTERE las dependencias existentes para referirse a la nueva vista (actualizando los datos si es necesario de antemano)
  4. Descarte la vista materializada original y los índices que ahora no deberían tener dependientes
  5. ALTERE LA vista materializada y los índices para soltar el sufijo para restaurar los nombres originales

p.ej.

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
fuente
No tengo claros esos dos últimos pasos. ¿Es 4 una oración que se ejecuta en 5? ¿podría hacer un ejemplo rápido con algunas vistas y vistas con nombre?
kimbo305
corrigió la oración truncada y agregó un ejemplo
RuiDC
1

En PgAdmin (versión 4.x), podría modificar fácilmente la definición (agregué una cláusula where) en el cuadro de propiedades. Su problema podría resolverse de esa manera.

usuario2953022
fuente