CREATE VIEW

CREATE VIEW создаёт представление.

Представление - это обёртка над SELECT запросом, позволяющая обращаться к нему как к таблице, в которую сохранены актуальные результаты выполнения этого запроса. Представление не хранит никаких данных, кроме текста запроса. Чтение из представления аналогично чтению из подзапроса.

Синтаксис

CREATE VIEW <имя>
[ WITH ( <имя_параметра_представления> [= <значение_параметра_представления>] [, ... ] ) ]
AS <запрос>

Параметры

  • имя - имя создаваемого представления. Должно быть уникально. Допускается запись в виде абсолютного пути до представления.
  • запрос - SELECT запрос, который выдаёт столбцы и строки представления.
  • WITH ( <имя_параметра_представления> [= <значение_параметра_представления>] [, ... ] ) позволяет задать значения параметров, определяющих поведение представления. Поддерживаются следующие опции:
    • security_invoker (Bool) - опция, при включении которой запрос, хранящийся в представлении, будет исполнен от имени пользователя, читающего из представления, а не от имени создателя представления.

Замечания

security_invoker опция должна быть всегда выставлена в TRUE, потому что поведением по умолчанию для представления является исполнение сохранённого запроса от имени создателя представления, но эта возможность на данный момент не реализована в YDB.

Контекст исполнения запроса, хранящегося в представлении, отличается от контекста объемлющего запроса, читающего из представления. Внутренний контекст создаётся заново и ничего не наследует из объемлющего. Он не "видит" ранее определённые PRAGMA (например, TablePathPrefix), именованные выражения и прочее. Самое важное следствие из этого состоит в том, что названия таблиц (и, возможно, других представлений), на которые ссылается создаваемое представление, должны быть записаны в виде абсолютного пути. В приведенных ниже примерах видно, что пути до таблиц, из которых читает создаваемое представление, записаны в абсолютном виде: /domain/database/path/to/underlying_table. В следующих релизах эта недоработка будет исправлена.

Если вы хотите задать список интересующих вас колонок или, например, переименовать одну из них в выдаче при чтении из представления, то сделать это можно, сохранив в представление подходящий запрос:

CREATE VIEW view_with_a_renamed_column WITH (security_invoker = TRUE) AS
SELECT
    original_column_name AS custom_column_name
FROM `/domain/database/path/to/underlying_table`;

Интерпретация символа * для получения списка колонок при чтении из подлежащих таблиц происходит каждый раз при чтении из представления. Это означает, что список колонок в результате следующего запроса:

/*
CREATE VIEW view_with_an_asterisk WITH (security_invoker = TRUE) AS
SELECT
    *
FROM `/domain/database/path/to/underlying_table`;
*/

SELECT * FROM view_with_an_asterisk;

изменится при добавлении или удалении колонок из подлежащей таблицы.

Примеры

Создание представления, которое будет возвращать список современных сериалов:

CREATE VIEW recent_series WITH (security_invoker = TRUE) AS
SELECT
    *
FROM `/domain/database/path/to/series`
WHERE
    release_date > Date("2020-01-01");

Создание представления, которое будет возвращать названия первых эпизодов современных сериалов:

CREATE VIEW recent_series_first_episodes_titles WITH (security_invoker = TRUE) AS
SELECT
    episodes.title AS first_episode
FROM `/domain/database/path/to/recent_series`
    AS recent_series
JOIN `/domain/database/path/to/episodes`
    AS episodes
USING(series_id)
WHERE episodes.season_id = 1 AND episodes.episode_id = 1;

См. также

Предыдущая
Следующая