PostgreSQL: витягнутий стовпець із подання


10

У мене є VIEWде я намагаюся створити сценарій еволюції для, тому я можу додати до нього стовпець. Ця частина чудово працює; стовпчик додано просто чудово. Однак реверс не працює; видалити цей останній доданий стовпець не вдається з ERROR: cannot drop columns from viewповідомленням. Проблема полягає в тому, що цей конкретний погляд має багато посилань, як від, так і до, тому я не можу просто DROP CASCADEпроклята річ!

Чи є причина, чому я не можу видалити щойно доданий стовпець із заданої VIEW? Тоді, що я можу зробити для виконання цього завдання?

(Зауважте: тут обставини є такими, якими вони є, але я дуже добре бачу подібну ситуацію, яка також скидає стовпчик з подання, у багатьох інших випадках.)


Як ви додали стовпчик в першу чергу? Ви не можете ALTER VIEW ... ADD COLUMN. Ви використовуєте CREATE OR REPLACE VIEW? Покажіть, будь ласка, свій код .
Крейг Рінгер

@CraigRinger, так, CREATE OR REPLACE VIEWз тим самим def, за винятком додаткового стовпця (оскільки у оновленій таблиці додано новий стовпець, тому представлення має включати його). "Деволюція" видаляє стовпчик із оновленої таблиці, тому VIEWдоводиться також більше не повертати її.
Янік Рошон

Відповіді:


13

PostgreSQL (вірно принаймні до 9.4) наразі не підтримує видалення стовпця CREATE OR REPLACE VIEW.

Новий запит повинен генерувати ті самі стовпці, що були створені за допомогою наявного запиту перегляду (тобто ті самі назви стовпців у тому самому порядку та з тими ж типами даних), але він може додавати додаткові стовпці до кінця списку.

Немає принципових причин, через які не можна було б додати підтримку скидання стовпців, але ще ніхто не провів необхідної роботи для її впровадження.

CREATE OR REPLACE VIEWдоведеться рекурсивно сканувати всі залежності та переконайтесь, що жодна з них не посилається на стовпчик, що підлягає скидженню. Якщо вони використовували SELECT *, доведеться видалити стовпчик з розширення *в залежності, а потім просканувати його залежності. У цьому є досить багато роботи, і є деякі області, де незрозуміло, як саме має поводитися падіння стовпця, особливо якщо мова йде про взаємодію із скиданням та перезавантаженням. Тож ніхто не хотів, щоб ця функція була достатньою для її реалізації. Патчі та / або спонсорство розвитку вітаються.

Вам доведеться кинути погляд і все, що від нього залежить, а потім відтворити його та його залежності. (Те ж саме було і для додавання стовпця до представлення; підтримка додавання стовпців була введена в 8.4).

Зауважте, що взагалі не очікується, що DDL може бути зворотним. Поняття "деволюції" дійсно хибно. Наприклад, якщо ви скинете стовпець, а потім додайте його ще раз, дані все одно відсутня.


2
Отже, що ви говорите, це те, що щоразу, коли великій програмі зі складними відносинами потрібно змінити стовпець, потрібно відтворити весь (або принаймні більшу частину) DDL? У мене немає великого досвіду роботи з postgre, але, виходячи з mySQL, у мене ніколи не було подібних проблем (з Oracle, SQL Server або MySQL), і мені здається дивним, що зміни просто не можна зробити і помилки (якщо будь-який) замість цього буде кинутий. Це обмеження є досить обмежуючим.
Янік Рошон

@YanickRochon Так, це біль, і я хотів би бачити, як це покращилося. Якщо ви хочете допомогти зробити це, розгляньте роботу з фінансування; див. postgresql.org/support/professional_support .
Крейг Рінгер

Ми занадто малі, щоб фінансувати таке підприємство. Але рада бачити, що це не зафіксована тема.
Янік Рошон

1
@YanickRochon Ярмарок досить. Це на TODO - "дозволити перегляд / правило перекомпіляції, коли нижча таблиця змінюється", wiki.postgresql.org/wiki/Todo#Views_and_Rules .
Крейг Рінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.