J'ai rencontré ce problème aujourd'hui et j'ai trouvé un moyen de contourner le problème pour éviter de laisser tomber et de recréer la vue. Je ne peux pas simplement abandonner ma VUE parce que c'est une VUE principale qui a de nombreuses VUES dépendantes construites dessus. Court d'avoir un script de reconstruction à DROP CASCADE, puis recréer toutes mes VIEWs c'est un travail autour.
Je modifiais ma vue principale pour utiliser une valeur fictive pour la colonne incriminée, modifiais la colonne dans la table et inversions ma vue sur la colonne. En utilisant une configuration comme ceci:
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;
Essayer de modifier le type de base_table_field1 comme ceci:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
vous donnera cette erreur:
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 vous changez master_view d'utiliser une valeur factice pour la colonne comme ceci:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
0.9999 AS field1
FROM base_table;
votre alter Lancez ensuite:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
et faire passer votre vue arrière:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
(base_table_field1 * .01)::numeric AS field1
FROM base_table;
Tout dépend si votre master_view a un type explicite qui ne change pas. Puisque mon VIEW utilise '(base_table_field1 * .01) :: numeric AS field1' cela fonctionne, mais 'base_table_field1 AS field1' ne le serait pas parce que le type de colonne change. Cette approche pourrait aider dans certains cas comme le mien.
Copiez la requête d'affichage et supprimez-la pour apporter des modifications à la table. – TaherT