web-dev-qa-db-fra.com

PostgreSQL: supprimer la colonne de la vue

J'ai un VIEW où j'essaye de créer un script d'évolution pour, donc je peux y ajouter une colonne. Cette partie fonctionne bien; colonne ajoutée très bien. Cependant, l'inverse ne fonctionne pas; supprimer cette dernière colonne ajoutée échoue avec un ERROR: cannot drop columns from view message. Le problème est que cette vue particulière a de nombreuses références, à la fois de et vers, donc je ne peux pas simplement DROP CASCADE la fichue chose!

Y a-t-il une raison pour laquelle je ne peux pas supprimer une colonne nouvellement ajoutée d'un VIEW donné? Alors, que puis-je faire pour accomplir cette tâche?

(Remarque: les circonstances, ici, sont ce qu'elles sont, mais je peux très bien voir une situation similaire, alias supprimer une colonne d'une vue, dans de nombreux autres cas.)

10
Yanick Rochon

PostgreSQL (vrai jusqu'à au moins 9.4) ne prend actuellement pas en charge la suppression d'une colonne avec CREATE OR REPLACE VIEW .

La nouvelle requête doit générer les mêmes colonnes que celles générées par la requête de vue existante (c'est-à-dire les mêmes noms de colonnes dans le même ordre et avec les mêmes types de données), mais elle peut ajouter des colonnes supplémentaires à la fin de la liste.

Il n'y a aucune raison fondamentale pour laquelle la prise en charge de la suppression de colonnes n'a pas pu être ajoutée, mais personne n'a encore effectué le travail requis pour l'implémenter.

CREATE OR REPLACE VIEW devrait analyser récursivement toutes les dépendances et s'assurer qu'aucune d'entre elles ne fait référence à la colonne à supprimer. S'ils ont utilisé SELECT * il faudrait supprimer la colonne de l'extension de * dans la dépendance puis scannez ses dépendances aussi. Il y a pas mal de travail impliqué dans cela, et il y a des domaines où on ne sait pas exactement comment le retrait de la colonne doit se comporter, en particulier en ce qui concerne les interactions avec le vidage et le rechargement. Donc, personne n'a encore voulu la fonctionnalité pour la mettre en œuvre. Les correctifs et/ou le parrainage du développement sont les bienvenus.

Vous devrez supprimer la vue et tout ce qui en dépend, puis la recréer et ses dépendances. (La même chose était vraie pour l'ajout d'une colonne à une vue; la prise en charge de l'ajout de colonnes a été introduite en 8.4).

Notez qu'en général, il n'y a aucune attente que le DDL soit réversible. Le concept de "dévolutions" est vraiment imparfait. Par exemple, si vous déposez une colonne, puis l'ajoutez à nouveau, les données sont toujours disparues.

13
Craig Ringer