web-dev-qa-db-fra.com

Remplacer une vue matérialisée dans Postgres

J'ai une vue matérialisée dans Postgres 9.3 que j'aimerais 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 plus de supprimer tous les objets dépendants et de les reconstruire chacun?

25
John

Depuis PostgreSQL 9.4: Différent 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.
17
alfonx

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. ALTER les dépendances existantes pour se référer à la place à la nouvelle vue (rafraîchissement 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
5
RuiDC

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.

1
user2953022