Я столкнулся с этой проблемой сегодня и нашел работу, чтобы избежать падения и воссоздания VIEW. Я не могу просто оставить свой просмотр, потому что это мастер VIEW, который имеет множество зависимых VIEW, построенных поверх него. Если у вас нет сценария восстановления DROP CASCADE, а затем воссоздайте ВСЕ мои просмотры, это будет работать.
Я изменяю свой мастер VIEW для использования фиктивного значения для столбца, вызывающего нарушение, изменяет столбец в таблице и переключает мой VIEW обратно в столбец. Использование установки, как это:
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;
Попытка изменить тип base_table_field1 как это:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
Даст вам эту ошибку:
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"
Если изменить master_view использовать фиктивное значение для колонны следующим образом:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
0.9999 AS field1
FROM base_table;
Затем запустите ваш альтер:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
и переключите вид сзади:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
(base_table_field1 * .01)::numeric AS field1
FROM base_table;
Все зависит от того, если ваш master_view имеет явный тип, который не меняется. Поскольку мой VIEW использует '(base_table_field1 * .01) :: numeric AS field1', он работает, но 'base_table_field1 AS field1' не будет потому, что тип столбца изменится. Такой подход может помочь в некоторых случаях, таких как мои.
скопируйте запрос вида и удалите его и внесите изменения в таблицу – TaherT