У меня есть место, VIEW
где я пытаюсь создать скрипт развития, чтобы я мог добавить к нему столбец. Эта часть отлично работает; колонка добавлена просто отлично. Однако обратное не работает; удалить последний добавленный столбец не удастся с ERROR: cannot drop columns from view
сообщением. Проблема в том, что этот конкретный взгляд имеет много ссылок, как от, так и к, поэтому я не могу просто DROP CASCADE
проклясть!
Есть ли причина, по которой я не могу удалить недавно добавленный столбец из заданного VIEW
? Тогда, что я могу сделать, чтобы выполнить эту задачу?
(Примечание: обстоятельства здесь такие, какие есть, но я очень хорошо вижу похожую ситуацию, во многих других случаях, например, отбрасывание столбца из представления.)
postgresql
view
postgresql-9.3
Яник Рошон
источник
источник
ALTER VIEW ... ADD COLUMN
. Вы используетеCREATE OR REPLACE VIEW
? Покажите свой код, пожалуйста.CREATE OR REPLACE VIEW
с тем же значением def, за исключением дополнительного столбца (поскольку в таблицу ref'ed добавлен новый столбец, поэтому представление должно включать его). «Деволюция» удаляет столбец из таблицы ref'ed, поэтомуVIEW
он также не должен больше его возвращать.Ответы:
PostgreSQL (с версией не ниже 9.4) в настоящее время не поддерживает удаление столбца с помощью
CREATE OR REPLACE VIEW
.Нет фундаментальной причины, по которой нельзя было бы добавить поддержку удаления столбцов, но никто еще не выполнил работу, необходимую для ее реализации.
CREATE OR REPLACE VIEW
пришлось бы рекурсивно сканировать все зависимости и убедиться, что ни одна из них не ссылалась на столбец, который нужно удалить. Если бы они использовалиSELECT *
его, ему пришлось бы удалить столбец из раскрытия*
в зависимости, а затем просканировать его зависимости. Для этого необходимо проделать немалую работу, и есть некоторые области, где неясно, как именно должен вести себя отбрасывание столбца, особенно когда речь идет о взаимодействиях с dump и reload. Так что никто не хотел, чтобы эта функция была достаточно реализована. Патчи и / или спонсорство разработки приветствуются.Вам придется отбросить представление и все, что от него зависит, а затем заново создать его и его зависимости. (То же самое использовалось для добавления столбца в представление; поддержка добавления столбцов была введена в 8.4).
Обратите внимание, что в целом не ожидается, что DDL будет обратимым. Понятие «деволюции» действительно ошибочно. Например, если вы отбрасываете столбец, а затем добавляете его снова, данные по-прежнему исчезают.
источник