Me encontré con este problema hoy y encontré una solución alternativa para evitar caer y volver a crear el VIEW. No puedo simplemente dejar caer mi VISTA porque es una VISTA maestra que tiene muchas VISTAS dependientes construidas sobre ella. A falta de tener un script de reconstrucción para DROP CASCADE y luego recrear TODAS mis VISTAS, esto es una solución alternativa.
Cambio mi VISTA maestra para usar un valor ficticio para la columna ofensiva, alteré la columna en la tabla y cambié mi VISTA de nuevo a la columna. Utilizando una configuración como esta:
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;
tratar de alterar el tipo base_table_field1 así:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
le dará este error:
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"
Si cambia master_view utilizar un valor ficticio para la columna como esta:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
0.9999 AS field1
FROM base_table;
A continuación, ejecute su alter:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
y el interruptor de su vista posterior:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
(base_table_field1 * .01)::numeric AS field1
FROM base_table;
Todo depende de si su master_view tiene un tipo explícito que no cambia. Como my VIEW usa '(base_table_field1 * .01) :: numeric AS field1', funciona, pero 'base_table_field1 AS field1' no porque el tipo de columna cambia. Este enfoque podría ayudar en algunos casos como el mío.
copie la consulta de la vista y luego elimínela y realice cambios en la Tabla – TaherT