CREATE VIEW

Определяет новое представление.

Обзор

CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW name
             [ ( column_name [, ...] ) ]
    [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
    AS query
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

Описание

CREATE VIEW определяет представление на основе запроса. Это представление не материализуется. Вместо этого запрос выполняется каждый раз, когда представление используется в другом запросе. Примечание: Если указано непрерывное агрегирование, представление будет материализовано.

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

Если указано имя схемы, представление создается в указанной схеме. В противном случае оно создается в текущей схеме. Временные представления находятся в специальных схемах, поэтому при создании временного представления имя схемы указывать нельзя. Имя представления должно отличаться от имён любых других представлений, таблиц, последовательностей, индексов или внешних таблиц в одной схеме.

Параметры

TEMPORARY | TEMP

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

RECURSIVE

  • Создает рекурсивное представление. Синтаксис:
    CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;
    Эквивалентно
    CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names) AS (SELECT ...) SELECT column_names FROM view_name;
    Рекурсивное представление должно быть явно указано.

name

  • Имя создаваемого представления (может быть указано вместе со схемой).

column_name

  • Необязательный список имён столбцов представления. Если не указан, имена столбцов берутся из запроса.

WITH ( view_option_name [= view_option_value] [, ... ] )

  • Этот раздел задаёт необязательные параметры представления; поддерживаются следующие параметры:
    • check_option (строка): может принимать значения local или cascaded, эквивалентно указанию WITH [CASCADED | LOCAL] CHECK OPTION (см. ниже). Этот параметр можно изменить для существующего представления с помощью ALTER VIEW.
    • security_barrier (логическое значение): следует использовать, если представление предназначено для обеспечения безопасности на уровне строк.
    • CONTINUOUS (логическое значение): если этот параметр указан, представление является материализованным представлением с непрерывным агрегированием.
    • POPULATE (логическое значение): определяет, будет ли представление с непрерывным кластеризацией синхронизировать исходные данные производительности. По умолчанию — true; если указано false, синхронизация будет происходить только при появлении новых вставленных данных.

query

  • Команды SELECT или VALUES, определяющие столбцы и строки представления.

Примечания

Представления в базе данных YMatrix доступны только для чтения. Система не позволяет выполнять операции вставки, обновления или удаления через представления. Эффект обновления представления можно достичь, создав правила перезаписи (rewrite rules), которые преобразуют операции в соответствующие действия над другими таблицами. Подробнее см. в разделе CREATE RULE.

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

CREATE VIEW vista AS SELECT 'Hello World';

Возможны два вида ошибок: имя столбца по умолчанию становится ?column?, а тип данных — unknown. Если вы хотите использовать строковые литералы в результатах представления, используйте подход, подобный следующему:

CREATE VIEW vista AS SELECT text 'Hello World' AS hello;

Доступ к таблицам, на которые ссылается представление, определяется правами владельца представления, а не текущего пользователя (даже если текущий пользователь — суперпользователь). Для суперпользователей это может быть неожиданно, поскольку обычно суперпользователи имеют доступ ко всем объектам. Однако в случае с представлением, если суперпользователь не является его владельцем, даже он должен получить явные права на доступ к таблицам, на которые ссылается представление.

Тем не менее, функции, вызываемые в представлении, обрабатываются так же, как если бы они вызывались напрямую из запроса с использованием этого представления. Поэтому пользователь представления должен иметь разрешение на вызов всех функций, используемых в этом представлении.

Если вы создаете представление с использованием предложения ORDER BY, то при выполнении SELECT из этого представления предложение ORDER BY игнорируется.

При использовании команды CREATE OR REPLACE VIEW для существующего представления изменяются только правила SELECT, определённые этим представлением. Другие свойства представления, включая владение, права доступа и правила, кроме SELECT, остаются без изменений. Чтобы заменить представление, вы должны быть его владельцем (включая членство в роли, которой принадлежит представление).

Примеры

Создание представления всех комедийных фильмов:

CREATE VIEW comedies AS SELECT * FROM films
WHERE kind = 'comedy';

Это создаст представление, содержащее столбцы таблицы film на момент создания представления. Хотя при создании представления используется *, столбцы, добавленные в таблицу позже, не войдут в состав представления.

Создание представления, возвращающего имена десяти самых популярных младенцев:

CREATE VIEW topten AS SELECT name, rank, gender, year FROM
names, rank WHERE rank < '11' AND names.id=rank.id;

Создание рекурсивного представления чисел от 1 до 100:

CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
    VALUES (1)
UNION ALL
    SELECT n+1 FROM nums_1_100 WHERE n < 100;

Обратите внимание, что хотя имя рекурсивного представления в этой команде CREATE VIEW указано с квалификатором схемы, внутренняя самоссылка не содержит квалификатора схемы. Это связано с тем, что неявно создаваемые имена CTE (Common Table Expressions) не могут быть квалифицированы по схеме.

Если указан параметр CONTINUOUS, представление непрерывного кластера будет:

CREATE VIEW cv1 WITH (CONTINUOUS, POPULATE=false) AS
    SELECT tag_id, COUNT(*), SUM(sensor)
    FROM metrics GROUP BY tag_id;

Совместимость

Стандарт SQL предусматривает некоторые дополнительные возможности, недоступные в базе данных YMatrix для команды CREATE VIEW. К необязательным предложениям полного SQL-оператора в стандарте относятся:

  • CHECK OPTION — данная опция связана с обновлением представлений. Все команды INSERT и UPDATE на представлении проверяются на соответствие условиям определения представления (то есть новые данные должны быть видны через это представление). Если условие не выполняется, обновление отклоняется.
  • LOCAL — проверка целостности применяется только к этому представлению.
  • CASCADED — проверка целостности применяется к этому представлению и ко всем зависимым представлениям. Если CASCADED или LOCAL не указаны, по умолчанию используется CASCADED.

CREATE OR REPLACE VIEW является расширением языка базы данных YMatrix. То же самое относится и к концепции временных представлений.

Смотрите также

ALTER VIEW, DROP VIEW