Tôi đã gặp sự cố này ngày hôm nay và đã tìm thấy một công việc xung quanh để tránh giảm và tạo lại VIEW. Tôi không thể chỉ thả VIEW vì nó là một VIEW chính có nhiều VIEWs phụ thuộc được xây dựng trên nó. Ngắn của việc có một kịch bản xây dựng lại để thả CASCADE và sau đó tạo lại tất cả các VIEWs của tôi đây là một công việc xung quanh.
Tôi thay đổi chế độ xem chính để sử dụng giá trị giả cho cột vi phạm, thay đổi cột trong bảng và chuyển VIEW của tôi trở lại cột. Sử dụng một thiết lập như thế này:
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;
Đang cố gắng để thay đổi loại base_table_field1 như thế này:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
sẽ cung cấp cho bạn lỗi này:
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"
Nếu bạn thay đổi master_view sử dụng một giá trị giả cho cột như sau:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
0.9999 AS field1
FROM base_table;
Sau đó chạy ALTER của bạn:
ALTER TABLE base_table ALTER COLUMN base_table_field1 TYPE numeric(10,6);
Và chuyển cái nhìn của bạn trở lại:
CREATE OR REPLACE VIEW master_view AS
SELECT
base_table_id AS id,
(base_table_field1 * .01)::numeric AS field1
FROM base_table;
Tất cả đều phụ thuộc vào nếu master_view của bạn có một loại rõ ràng điều đó không thay đổi. Vì VIEW của tôi sử dụng '(base_table_field1 * .01) :: số AS field1' nó hoạt động, nhưng 'base_table_field1 AS field1' sẽ không phải vì loại cột thay đổi. Cách tiếp cận này có thể giúp trong một số trường hợp như tôi.
sao chép truy vấn xem và xóa truy vấn đó và thực hiện các thay đổi đối với Bảng – TaherT