Remplacer une vue matérialisée dans Postgres


23

J'ai une vue matérialisée en ce Postgres 9.3que je voudrais mettre à jour avec de nouvelles colonnes. Cependant, d'autres vues matérialisées dépendent également de cette vue, et le message d'erreur indique que la suppression d'une vue n'est pas possible lorsque d'autres objets en dépendent.

ERREUR: impossible de supprimer la vue matérialisée latest_charges car d'autres objets en dépendent

Il ressort également de la documentation que le mot clé REPLACE n'est pas valide pour une vue matérialisée. Existe-t-il un raccourci en dehors de la suppression de tous les objets dépendants et de la reconstruction de chacun?


7
Malheureusement, je pense que vous êtes obligé de tout laisser tomber et de reconstruire.
Craig Ringer

@CraigRinger intéressé à ajouter ceci comme réponse?
dezso

Réponses:


17

Depuis PostgreSQL 9.4: Différente de la documentation de CREATE VIEW , la documentation de CREATE MATERIALIZED VIEW ne mentionne PAS le mot-clé REPLACE. Il ne semble pas y avoir de raccourci en dehors de la suppression de tous les objets dépendants et de la reconstruction de chacun.

Lorsque vous le faites, je ne peux que recommander deux petites choses:

  1. Utilisez DROP MATERIALIZED VIEW blabla CASCADE pour obtenir une liste de tous les objets dépendants
  2. Effectuez la suppression et la recréation de tous les objets dépendants en une seule transaction.

1
Merci, c'est exactement comme ça que je le fais. Il est juste difficile de rester droit car je crée une vue matérialisée de base à des fins analytiques qui est réutilisée dans de nombreuses autres vues. Cette vue de base change rarement, mais celles qui en dépendent changent quotidiennement.
John

4

Pour ma situation, je préfère limiter les baisses en utilisant un calque de vue:

  1. Créez une copie de la vue matérialisée avec le suffixe "_new" et utilisez également "WITH NO DATA" pour les performances, assurez-vous que tous les index sont également créés avec le suffixe et tout autre objet dépendant découvert via DROP ... CASCADE
  2. Créez une vue sur la nouvelle vue matérialisée pour fournir la couche d'abstraction, je n'ai donc besoin de la changer qu'en un seul endroit
  3. MODIFIER les dépendances existantes pour se référer à la place à la nouvelle vue (actualisation des données si nécessaire au préalable)
  4. Supprimez la vue matérialisée d'origine et les index qui ne devraient plus avoir de personnes à charge
  5. MODIFIER la vue matérialisée et les index pour supprimer le suffixe et restaurer les noms d'origine

par exemple.

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

Je ne suis pas clair sur ces deux dernières étapes. 4 est-il une phrase qui se prolonge en 5? pourriez-vous faire un exemple rapide avec quelques vues et vues de mat nommé?
kimbo305

corrigé la phrase tronquée et ajouté un exemple
RuiDC

1

Dans PgAdmin (version 4.x), je pouvais facilement modifier la définition (j'ai ajouté une clause where) dans la boîte de propriétés. Votre problème pourrait être résolu de cette façon.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.