×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

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

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

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

6.1.95. CREATE VIEW

6.1.95. CREATE VIEW

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 действует аналогично, но если представление с таким именем уже существует, оно заменяется. Новый запрос должен генерировать те же столбцы, что генерировались существующим запросом представления (то есть те же имена столбцов в том же порядке и с теми же типами данных), но он может добавлять дополнительные столбцы в конец списка. Вычисления, приводящие к выходным столбцам, могут быть полностью другими.

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

Параметры

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 (enum)

Этот параметр может быть либо local, либо cascaded и эквивалентен указанию WITH [ CASCADED | LOCAL ] CHECK OPTION (см. ниже).

security_barrier (boolean)

Этот параметр следует использовать, если представление предназначено для обеспечения безопасности на уровне строк. Подробности см. в Раздел 5.4.5.

security_invoker (boolean)

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

Все перечисленные выше параметры могут быть изменены для существующих представлений с помощью команды ALTER VIEW.

query

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

WITH [ CASCADED | LOCAL ] CHECK OPTION

Этот параметр управляет поведением автоматически обновляемых представлений. Когда этот параметр указан, команды INSERT, UPDATE и MERGE в представлении будут проверяться, чтобы убедиться, что новые строки удовлетворяют условию, определяющему представление (то есть новые строки проверяются на то, что они видны через представление). Если это не так, изменение будет отклонено. Если CHECK OPTION не указан, командам INSERT, UPDATE и MERGE в представлении разрешено создавать строки, которые не видны через представление. Поддерживаются следующие параметры проверки:

LOCAL

Новые строки проверяются только на соответствие условиям, определённым непосредственно в самом представлении. Любые условия, определённые для базовых представлений, не проверяются (если они также не указывают CHECK OPTION).

CASCADED

Новые строки проверяются на соответствие условиям представления и всех базовых представлений. Если указан CHECK OPTION, и не указан ни LOCAL, ни CASCADED, то предполагается CASCADED.

CHECK OPTION нельзя использовать с RECURSIVE представлениями.

Обратите внимание, что CHECK OPTION поддерживается только для представлений, которые являются автоматически обновляемыми и не имеют триггеров INSTEAD OF или правил INSTEAD. Если автоматически обновляемое представление определено поверх базового представления, у которого есть триггеры INSTEAD OF, то может использоваться LOCAL CHECK OPTION для проверки условий на автоматически обновляемом представлении, но условия на базовом представлении с триггерами INSTEAD OF не будут проверяться (каскадный параметр проверки не будет каскадироваться вниз на представление, обновляемое через триггеры, и любые параметры проверки, определённые непосредственно на представлении, обновляемом через триггеры, будут игнорироваться). Если представление или любое из его базовых отношений имеет правило INSTEAD, которое приводит к перезаписи команд INSERT или UPDATE, то все параметры проверки будут проигнорированы в перезаписанном запросе, включая любые проверки от автоматически обновляемых представлений, определённых поверх отношения с правилом INSTEAD. MERGE не поддерживается, если представление или любое из его базовых отношений имеет правила.

Примечания

Для удаления представлений используйте команду DROP VIEW.

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

CREATE VIEW vista AS SELECT 'Hello World';

является плохой практикой, потому что имя столбца по умолчанию становится ?column?; также тип данных столбца по умолчанию становится text, что может быть не тем, что вам нужно. Лучший стиль для строкового литерала в результате представления — это что-то вроде:

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

По умолчанию доступ к базовым отношениям, на которые ссылается представление, определяется разрешениями владельца представления. В некоторых случаях это может быть использовано для обеспечения безопасного, но ограниченного доступа к базовым таблицам. Однако не все представления защищены от несанкционированного вмешательства; подробности см. в Раздел 5.4.5.

Если для представления установлено свойство security_invoker в значение true, доступ к базовым отношениям определяется разрешениями пользователя, выполняющего запрос, а не владельца представления. Таким образом, пользователь представления с проверкой безопасности должен иметь соответствующие разрешения на представление и его базовые отношения.

Если какое-либо из базовых отношений является представлением с проверкой безопасности, оно будет обрабатываться так, как если бы к нему обратились напрямую из исходного запроса. Таким образом, представление с проверкой безопасности всегда будет проверять свои базовые отношения, используя разрешения текущего пользователя, даже если к нему обращаются из представления без свойства security_invoker.

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

Функции, вызываемые в представлении, обрабатываются так же, как если бы они были вызваны напрямую из запроса, использующего представление. Поэтому пользователь представления должен иметь разрешения на вызов всех функций, используемых представлением. Функции в представлении выполняются с привилегиями пользователя, выполняющего запрос, или владельца функции, в зависимости от того, определены ли функции как SECURITY INVOKER или SECURITY DEFINER. Таким образом, например, вызов CURRENT_USER непосредственно в представлении всегда будет возвращать вызывающего пользователя, а не владельца представления. На это не влияет настройка security_invoker представления, поэтому представление с security_invoker, установленным в false, не эквивалентно функции SECURITY DEFINER, и эти концепции не следует путать.

Пользователь, создающий или заменяющий представление, должен иметь привилегию USAGE на любые схемы, упомянутые в запросе представления, чтобы искать указанные объекты в этих схемах. Обратите внимание, однако, что этот поиск происходит только при создании или замене представления. Поэтому пользователь представления должен иметь только привилегию USAGE на схему, содержащую представление, а не на схемы, упомянутые в запросе представления, даже для представления с проверкой безопасности.

Когда используется CREATE OR REPLACE VIEW для существующего представления, изменяются только определяющее правило SELECT представления, а также любые параметры WITH ( ... ) и его CHECK OPTION. Другие свойства представления, включая владельца, разрешения и не-SELECT правила, остаются неизменными. Вы должны владеть представлением, чтобы заменить его (это включает членство в роли-владельце).

Обновляемые представления

Простые представления являются автоматически обновляемыми: система разрешает использовать операторы INSERT, UPDATE, DELETE и MERGE в представлении таким же образом, как и в обычной таблице. Представление является автоматически обновляемым, если оно удовлетворяет всем следующим условиям:

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

  • Определение представления не должно содержать на верхнем уровне предложений WITH, DISTINCT, GROUP BY, HAVING, LIMIT или OFFSET.

  • Определение представления не должно содержать на верхнем уровне операций над множествами (UNION, INTERSECT или EXCEPT).

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

Автоматически обновляемое представление может содержать как обновляемые, так и необновляемые столбцы. Столбец является обновляемым, если это простая ссылка на обновляемый столбец базового отношения; в противном случае столбец доступен только для чтения, и будет вызвана ошибка, если оператор INSERT, UPDATE или MERGE попытается присвоить ему значение.

Если представление автоматически обновляемо, система преобразует любые операторы INSERT, UPDATE, DELETE или MERGE в представлении в соответствующие операторы в базовом отношении. Полностью поддерживаются операторы INSERT, имеющие предложение ON CONFLICT UPDATE.

Если автоматически обновляемое представление содержит условие WHERE, это условие ограничивает, какие строки базового отношения доступны для изменения операторами UPDATE, DELETE и MERGE в представлении. Однако оператор UPDATE или MERGE может изменить строку так, что она перестанет удовлетворять условию WHERE, и, следовательно, перестанет быть видимой через представление. Аналогично, оператор INSERT или MERGE может потенциально вставлять строки базового отношения, которые не удовлетворяют условию WHERE и, следовательно, не видны через представление (ON CONFLICT UPDATE может аналогично повлиять на существующую строку, не видимую через представление). Параметр CHECK OPTION может быть использован для предотвращения создания операторами INSERT, UPDATE и MERGE таких строк, которые не видны через представление.

Если автоматически обновляемое представление помечено свойством security_barrier, то все условия WHERE представления (и любые условия с использованием операторов, помеченных как LEAKPROOF) всегда будут вычисляться до любых условий, добавленных пользователем представления. Полные подробности см. в Раздел 5.4.5. Обратите внимание, что из-за этого строки, которые в конечном итоге не возвращаются (потому что они не проходят условия WHERE пользователя), всё равно могут быть заблокированы. EXPLAIN может быть использован, чтобы увидеть, какие условия применяются на уровне отношения (и поэтому не блокируют строки), а какие — нет.

Более сложное представление, не удовлетворяющее всем этим условиям, по умолчанию доступно только для чтения: система не разрешит выполнять INSERT, UPDATE, DELETE или MERGE в представлении. Вы можете добиться эффекта обновляемого представления, создав триггеры INSTEAD OF на представлении, которые должны преобразовывать попытки вставки и т.д. в представлении в соответствующие действия над другими таблицами. Для получения дополнительной информации см. CREATE TRIGGER. Другая возможность — создание правил (см. CREATE RULE), но на практике триггеры проще для понимания и правильного использования. Также обратите внимание, что MERGE не поддерживается для отношений с правилами.

Обратите внимание, что пользователь, выполняющий вставку, обновление или удаление в представлении, должен иметь соответствующие привилегии INSERT, UPDATE или DELETE на представление. Кроме того, по умолчанию владелец представления должен иметь соответствующие привилегии на базовые отношения, в то время как пользователь, выполняющий обновление, не нуждается ни в каких разрешениях на базовые отношения (см. Раздел 5.4.5). Однако, если у представления установлено свойство security_invoker в true, пользователь, выполняющий обновление, а не владелец представления, должен иметь соответствующие привилегии на базовые отношения.

Примеры

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

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

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

Создать представление с LOCAL CHECK OPTION:

CREATE VIEW universal_comedies AS
    SELECT *
    FROM comedies
    WHERE classification = 'U'
    WITH LOCAL CHECK OPTION;

Это создаст представление на основе представления comedies, показывающее только фильмы с kind = 'Comedy' и classification = 'U'. Любая попытка выполнить INSERT или UPDATE строки в представлении будет отклонена, если новая строка не имеет classification = 'U', но тип фильма kind проверяться не будет.

Создать представление с CASCADED CHECK OPTION:

CREATE VIEW pg_comedies AS
    SELECT *
    FROM comedies
    WHERE classification = 'PG'
    WITH CASCADED CHECK OPTION;

Это создаст представление, которое проверяет как kind, так и classification новых строк.

Создать представление со смесью обновляемых и необновляемых столбцов:

CREATE VIEW comedies AS
    SELECT f.*,
           country_code_to_name(f.country_code) AS country,
           (SELECT avg(r.rating)
            FROM user_ratings r
            WHERE r.film_id = f.id) AS avg_rating
    FROM films f
    WHERE f.kind = 'Comedy';

Это представление будет поддерживать INSERT, UPDATE и DELETE. Все столбцы из таблицы films будут обновляемыми, тогда как вычисляемые столбцы country и avg_rating будут доступны только для чтения.

Создать рекурсивное представление, состоящее из чисел от 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, его внутренняя ссылка на себя не квалифицирована схемой. Это связано с тем, что имя неявно созданного CTE не может быть квалифицировано схемой.

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

CREATE OR REPLACE VIEW является расширением Digital Q.DataBase. Как и концепция временного представления. Предложение WITH ( ... ) также является расширением, как и представления с барьером безопасности (security barrier) и представления с проверкой безопасности (security invoker).

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению