Изменить столбцы PostgreSQL, используемые в представлениях

Я бы хотел, чтобы PostegreSQL немного расслабился. Каждый раз, когда я хочу изменить столбец, используемый в представлении, кажется, что мне нужно отбросить представление, изменить поле и затем воссоздать представление. Могу ли я отказаться от дополнительной защиты и просто сказать PostgreSQL, чтобы я сменил поле, а затем выяснил, как настроить представление?

Пояснение: я понимаю, что такое мнение. На самом деле, это потому, что представление похоже на подзапрос, и я хотел бы просто изменить базовые таблицы и сделать так, чтобы представление восприняло изменение.

Допустим, у меня есть следующее:

CREATE TABLE monkey
(
  "name" character varying(50) NOT NULL,
)

CREATE OR REPLACE VIEW monkey_names AS 
 SELECT name
   FROM monkey

Я действительно просто хочу сделать следующее в сценарии миграции, без необходимости отбрасывать и заново создавать представление.

ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL

1 ответ

Решение

Постоянное решение для этого случая

Чтобы вообще избежать проблемы, используйте тип данных text или же varchar / character varying без спецификатора длины вместо character varying(n), Читайте об этих типах данных в руководстве.

CREATE TABLE monkey(name text NOT NULL)

Если вы действительно хотите установить максимальную длину, создайте CHECK ограничение:

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

Вы можете изменить или удалить это ограничение в любое время, не касаясь зависимых объектов, таких как представления, и не заставляя Postgres записывать новые строки в таблицу из-за изменения типа (что больше не всегда необходимо в современной версии Postgres).

Детальное объяснение

По предложению @Michael я добавлю более общую информацию:

Представление в PostgreSQL - это не просто псевдоним подзапроса. Представления реализованы в виде специальных таблиц с правилом ON SELECT TO my_view DO INSTEAD, (Вот почему вы можете изменить вид с ALTER TABLE команда.) Вы можете GRANT привилегии для него, добавлять комментарии или даже определять значения по умолчанию столбца (полезно для правила ON INSERT TO my_view DO INSTEAD...). Читайте больше в руководстве здесь или здесь.

Если вы изменяете базовые объекты, вам также необходимо изменить определяющий запрос любого зависимого представления. ALTER VIEW Оператор может изменять только вспомогательные атрибуты представления. использование CREATE OR REPLACE VIEW изменить запрос - он сохранит любые дополнительные атрибуты.

Однако, если вы хотите изменить типы данных результирующих столбцов (как в данном случае), CREATE OR REPLACE VIEW это невозможно. Ты должен DROP старый и CREATE новый взгляд. Это никогда не удалит какие-либо данные из базовых таблиц. Тем не менее, будут отброшены все дополнительные атрибуты представления, которые также необходимо воссоздать.

Другие вопросы по тегам