Changement de PostgreSQL colonnes utilisées dans les vues
Je voudrais PostegreSQL pour se détendre un peu. Chaque fois que je veux modifier une colonne utilisée dans une vue, il semble que j'ai à la baisse de la vue, modifiez le champ, puis de les recréer la vue. Puis-je renoncer à cette protection supplémentaire et juste dire PostgreSQL permettez-moi de changer de domaine et de déterminer l'ajustement de la vue?
Précisions:
Je comprends ce point de vue est. En fait, c'est parce que la vue est comme une sous-requête que je souhaite que je pourrais juste changer les tables sous-jacentes et d'avoir le point de vue de ramasser le changement.
Disons que j'ai le texte suivant:
CREATE TABLE monkey
(
"name" character varying(50) NOT NULL,
)
CREATE OR REPLACE VIEW monkey_names AS
SELECT name
FROM monkey
J'ai vraiment envie de le faire ce qui suit dans un script de migration sans avoir à supprimer et recréer la vue.
ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL
Je l'ai dit cette chose mal... donnez-moi une minute pour expliquer.
Ah désolé. Compte tenu de votre réputation, je me demandais si c'était vraiment ce que vous demandez. Je suis curieux de savoir si il y a une réponse ici, car j'ai le sentiment que je vais faire dans l'année à venir.
Il y a en fait un
ALTER VIEW
déclaration dans PostgreSQL. Vous ne pouvez pas changer le point de vue de la définition de la requête, mais il y a d'autres auxiliaires attributs.OriginalL'auteur Larsenal | 2011-12-15
Vous devez vous connecter pour publier un commentaire.
Solution permanente pour ce cas
Pour éviter tout problème utilisez le type de données
text
ouvarchar
/character varying
sans un spécificateur de longueur au lieu decharacter varying(n)
. Lisez à propos de ces types de données dans le manuel.Si vous avez vraiment envie de faire appliquer une longueur maximale, créer une
CASE
contrainte:Vous pouvez modifier ou supprimer cette contrainte tout moment, sans toucher en fonction des objets comme des points de vue et sans forcer Postgres pour écrire de nouvelles lignes dans le tableau en raison du changement de type (ce qui n'est pas toujours nécessaire de tout plus moderne que la version de Postgres).
Explication détaillée
Proposé par @Michael, j'ai ajouté quelques informations plus générales:
Vue dans PostgreSQL n'est pas seulement un "alias de sous-requête". Les vues sont mises en œuvre comme les tables spéciales avec une règle
ON SELECT TO my_view DO INSTEAD
. (C'est pourquoi vous pouvez modifier les points de vue avec uneALTER TABLE
de commande.) Vous pouvezGRANT
privilèges, ajouter des commentaires ou même de définir des valeurs par défaut de la colonne (utile pour une règleON INSERT TO my_view DO INSTEAD...
). Lire la suite dans le manuel ici ou ici.Si vous modifiez les objets sous-jacents, vous avez besoin de changer la définition de requête de tout en fonction de la vue, trop. Le
ALTER VIEW
instruction ne peut changer auxiliaire attributs d'un point de vue. UtilisationCREATE OR REPLACE VIEW
pour modifier la requête - il permettra de préserver les attributs supplémentaires.Cependant, si vous souhaitez modifier les types de données des colonnes (comme dans le cas à portée de main),
CREATE OR REPLACE VIEW
n'est pas possible. Vous devezDROP
l'ancien etCREATE
un nouveau point de vue. Ce ne sera jamais supprimer toutes les données des tables sous-jacentes. Il sera baisse, tous les attributs de la vue, mais qui doivent être recréés, trop.@
ing vous, j'avais le sentiment qu'une fois que vous commencez en commentant, vous êtes informé de tout dans ce thread. +1 et mon supprimés.Merci @Erwin, et si je veux ajouter une colonne dans la TABLE? Comment Ça va gérées par la VUE ?
Vue inclut uniquement les colonnes indiquées au moment de la création.
SELECT *
est résolu à la liste actuelle des colonnes au moment de la création ("early binding"). Les colonnes ajoutées à la table sous-jacente plus tard sont pas traduit dans une vue automatiquement. Vous devez recréer / créer une nouvelle vue pour inclure plus de colonnes.OriginalL'auteur Erwin Brandstetter