Mi sono imbattuto in questo problema oggi e ho trovato un lavoro in giro per evitare di lasciar cadere e ricreare la VISTA. Non posso semplicemente abbandonare la VISUALIZZAZIONE perché è una VISUALIZZAZIONE principale che ha molti VIEW dipendenti costruiti su di essa. A meno di avere uno script di ricostruzione per DROP CASCADE e quindi ricreare TUTTE le mie VISUALIZZAZIONI, si tratta di una soluzione.
Ho cambiato la mia VISTA master per utilizzare un valore fittizio per la colonna offendente, ha modificato la colonna nella tabella e ho riportato la VIEW alla colonna. Utilizzando una configurazione come questa:
CREATE TABLE base_table
(
base_table_id integer,
base_table_field1 numeric(10,4)
);
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
(base_table_field1 * .01)::numeric AS field1
FROM base_table;
CREATE OR REPLACE VIEW dependent_view AS
SELECT
id AS dependent_id,
field1 AS dependent_field1
FROM master_view;
Cercando di modificare il tipo base_table_field1 come questo:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
vi darà questo errore:
ERROR: cannot alter type of a column used by a view or rule
DETAIL: rule _RETURN on view master_view depends on column "base_table_field1"
Se si cambia master_view di utilizzare un valore fittizio per la colonna come questa:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
0.9999 AS field1
FROM base_table;
quindi eseguire il alter:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
e passare il punto di vista posteriore:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
(base_table_field1 * .01)::numeric AS field1
FROM base_table;
Tutto dipende se il vostro master_view ha un tipo esplicito che non cambia. Dal momento che il mio VIEW usa '(base_table_field1 * .01) :: numerico AS campo1' funziona, ma 'base_table_field1 AS campo1' non lo farebbe perché il tipo di colonna cambia. Questo approccio potrebbe aiutare in alcuni casi come il mio.
copia la query di visualizzazione e poi la elimina e apporta le modifiche alla tabella – TaherT