PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Modifica le colonne PostgreSQL utilizzate nelle viste

Soluzione definitiva per questo caso

Per evitare del tutto il problema, utilizzare il tipo di dati text o varchar / character varying senza uno specificatore di lunghezza invece di character varying(n) . Leggi questi tipi di dati nel manuale.

CREATE TABLE monkey(name text NOT NULL)

Se vuoi davvero imporre una lunghezza massima, crea un CHECK vincolo :

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

Puoi modificare o eliminare quel vincolo in qualsiasi momento senza toccare oggetti dipendenti come le viste e senza costringere Postgres a scrivere nuove righe nella tabella a causa del cambio di tipo (che non è più sempre necessario nella versione moderna di Postgres).

Spiegazione dettagliata

Come proposto da @Michael, aggiungo alcune informazioni più generali:

Una vista in PostgreSQL non è solo un "alias per subquery". Le viste sono implementate come tabelle speciali con una regola ON SELECT TO my_view DO INSTEAD . (Ecco perché puoi modificare le visualizzazioni con un ALTER TABLE comando.) Puoi GRANT privilegi ad esso, aggiungere commenti o persino definire i valori predefiniti delle colonne (utile per una regola ON INSERT TO my_view DO INSTEAD... ). Leggi di più nel manuale qui o qui.

Se si modificano gli oggetti sottostanti, è necessario modificare anche la query di definizione di qualsiasi vista dipendente. Il ALTER VIEW l'istruzione può modificare solo gli attributi ausiliari di una vista. Usa CREATE OR REPLACE VIEW per modificare la query - conserverà eventuali attributi aggiuntivi.

Tuttavia, se desideri modificare i tipi di dati delle colonne risultanti (come nel caso in questione), CREATE OR REPLACE VIEW non è possibile. Devi DROP il vecchio e CREATE una nuova visione. Questo non cancellerà mai alcun dato delle tabelle sottostanti. Lo farà tuttavia, elimina tutti gli attributi aggiuntivi della vista, che devono essere ricreati.