PostgreSQL: thả cột khỏi chế độ xem


10

Tôi có một VIEWnơi tôi đang cố gắng tạo một kịch bản tiến hóa, vì vậy tôi có thể thêm một cột vào nó. Phần đó hoạt động tốt; cột thêm tốt. Tuy nhiên, điều ngược lại không hoạt động; loại bỏ cột được thêm cuối cùng không thành công với một ERROR: cannot drop columns from viewtin nhắn. Vấn đề là quan điểm cụ thể này có nhiều tài liệu tham khảo, cả từ và đến, do đó tôi không thể chỉ là DROP CASCADEthứ ngu ngốc!

Có một lý do tại sao tôi không thể xóa một cột mới được thêm vào từ một cột nhất định VIEW? Sau đó, tôi có thể làm gì để hoàn thành nhiệm vụ này?

(Lưu ý: hoàn cảnh, ở đây, là những gì chúng là, nhưng tôi rất có thể thấy một tình huống tương tự, hay còn gọi là thả một cột khỏi chế độ xem, trong nhiều trường hợp khác.)


Làm thế nào bạn thêm cột ở vị trí đầu tiên? Bạn không thể ALTER VIEW ... ADD COLUMN. Bạn đang sử dụng CREATE OR REPLACE VIEW? Vui lòng hiển thị mã của bạn .
Craig Ringer

@CraigRinger, vâng, CREATE OR REPLACE VIEWvới cùng một def, ngoại trừ một cột phụ (vì một bảng giới thiệu có một cột mới được thêm vào, vì vậy chế độ xem phải bao gồm nó). "Độ phân giải" sẽ xóa cột khỏi bảng giới thiệu, do đó, VIEWcũng không phải trả lại nó nữa.
Yanick Rochon

Câu trả lời:


13

PostgreSQL (đúng tối thiểu 9,4) hiện không hỗ trợ xóa một cột bằng CREATE OR REPLACE VIEW.

Truy vấn mới phải tạo cùng một cột được tạo bởi truy vấn chế độ xem hiện tại (nghĩa là cùng tên cột theo cùng thứ tự và cùng loại dữ liệu), nhưng nó có thể thêm các cột bổ sung vào cuối danh sách.

Không có lý do cơ bản tại sao không thể thêm hỗ trợ cho việc thả cột, nhưng chưa có ai thực hiện công việc cần thiết để thực hiện nó.

CREATE OR REPLACE VIEWsẽ phải quét đệ quy tất cả các phụ thuộc và đảm bảo rằng không ai trong số chúng tham chiếu cột bị bỏ. Nếu họ đã sử dụng, SELECT *họ sẽ phải xóa cột khỏi sự mở rộng của *phần phụ thuộc, sau đó cũng quét phần phụ thuộc của nó . Có một chút công việc liên quan đến việc đó, và có một số lĩnh vực không rõ chính xác việc thả cột sẽ hoạt động như thế nào, đặc biệt là khi nói đến tương tác với đổ và tải lại. Vì vậy, không ai muốn tính năng này đủ để thực hiện nó. Các bản vá và / hoặc tài trợ phát triển đều được chào đón.

Bạn sẽ phải bỏ chế độ xem và mọi thứ phụ thuộc vào nó, sau đó tạo lại nó và các phụ thuộc của nó. (Điều tương tự cũng được sử dụng là đúng khi thêm cột vào chế độ xem; hỗ trợ thêm cột được giới thiệu trong 8.4).

Lưu ý rằng nhìn chung không có kỳ vọng rằng DDL có thể đảo ngược. Khái niệm "phá hủy" là thực sự thiếu sót. Ví dụ: nếu bạn thả một cột, sau đó thêm lại, dữ liệu vẫn không còn.


1
Vì vậy, điều bạn đang nói là, bất cứ khi nào một ứng dụng lớn có mối quan hệ phức tạp cần thay đổi một cột, thì cần phải tạo lại toàn bộ (hoặc ít nhất là một phần của) DDL? Tôi không có nhiều kinh nghiệm với postgre, nhưng đến từ myQuery, tôi chưa bao giờ gặp vấn đề như vậy (với Oracle, SQL Server hoặc MySQL) và có vẻ lạ đối với tôi rằng thay đổi không thể đơn giản được thực hiện và lỗi (nếu bất kỳ) được ném vào thời gian thực hiện thay thế. Hạn chế này là khá hạn chế.
Yanick Rochon

@YanickRhol Yep, đó là một nỗi đau, và tôi rất muốn thấy nó được cải thiện. Nếu bạn muốn giúp thực hiện điều đó, hãy xem xét tài trợ cho công việc đó; xem postgresql.org/support/prof Profession_support .
Craig Ringer

Chúng ta quá nhỏ để tài trợ cho một doanh nghiệp như vậy. Nhưng vui mừng khi thấy nó không phải là một chủ đề cố định.
Yanick Rochon

1
@YanickRhol Hội chợ đủ rồi. Đó là trên TODO - "cho phép biên dịch lại chế độ xem / quy tắc khi bảng bên dưới thay đổi", wiki.postgresql.org/wiki/Todo#Views_and_Rules .
Craig Ringer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.