Sostituisci una vista materializzata in Postgres


23

Ho una visione materializzata in Postgres 9.3quanto vorrei aggiornare con nuove colonne. Tuttavia, anche altre viste materializzate dipendono da questa vista e il messaggio di errore indica che non è possibile rilasciare una vista quando altri oggetti dipendono da essa.

ERRORE: impossibile eliminare la vista materializzata latest_charges perché altri oggetti dipendono da esso

Risulta inoltre dalla documentazione che la parola chiave REPLACE non è valida per una vista materializzata. C'è qualche scorciatoia oltre a far cadere tutti gli oggetti dipendenti e ricostruire ognuno?


7
Purtroppo, penso che tu sia bloccato nel lasciarli tutti e ricostruire.
Craig Ringer,

@CraigRinger interessato ad aggiungere questo come risposta?
dezso

Risposte:


17

A partire da PostgreSQL 9.4: Diversamente dalla documentazione di CREATE VIEW , la documentazione di CREATE MATERIALIZED VIEW NON menziona la parola chiave REPLACE. Sembra che non ci siano scorciatoie oltre a far cadere tutti gli oggetti dipendenti e ricostruire ciascuno di essi.

Quando lo fai, posso solo consigliare due piccole cose:

  1. Utilizzare DROP MATERIALIZED VIEW blabla CASCADE per ottenere un elenco di tutti gli oggetti dipendenti
  2. Esegui il rilascio e la ricreazione di tutti gli oggetti dipendenti in un'unica transazione.

1
Grazie, è esattamente così che l'ho fatto. È solo una seccatura rimanere dritto poiché sto costruendo una vista materializzata di base per scopi analitici che viene riutilizzata in molte altre viste. Quella vista di base cambia raramente, ma quelli che dipendono da essa cambiano ogni giorno.
Giovanni,

4

Per la mia situazione, preferisco limitare le gocce utilizzando un livello di visualizzazione:

  1. Creare una copia della vista materializzata con il suffisso "_new" e utilizzare anche "WITH NO DATA" per le prestazioni, assicurarsi che vengano creati anche eventuali indici con suffisso e qualsiasi altro oggetto dipendente rilevato tramite DROP ... CASCADE
  2. Crea una vista sulla nuova vista materializzata per fornire lo strato di astrazione, quindi ho solo bisogno di cambiarlo in un posto
  3. MODIFICARE le dipendenze esistenti per fare invece riferimento alla nuova vista (aggiornare i dati se necessario in anticipo)
  4. Rilascia la vista e gli indici materializzati originali che ora non dovrebbero avere dipendenti
  5. MODIFICARE la vista e gli indici materializzati per eliminare il suffisso per ripristinare i nomi originali

per esempio.

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

Non sono chiaro su questi ultimi due passaggi. 4 è una frase che viene eseguita in 5? potresti fare un rapido esempio con alcune visualizzazioni e viste con nome?
kimbo305,

corretta la frase troncata e aggiunto esempio
RuiDC

1

In PgAdmin (versione 4.x), ho potuto facilmente modificare la definizione (ho aggiunto una clausola where) nella finestra delle proprietà. Il tuo problema potrebbe essere risolto in questo modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.