Spec-Zone.ru › MySQL 9.2

15.1.24 Оператор CREATE VIEW

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

CREATE
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    [IF NOT EXISTS] VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

Оператор CREATE VIEW создаёт новую представление или заменяет существующую, если указан клауз OR REPLACE. Если представление не существует, CREATE OR REPLACE VIEW эквивалентен CREATE VIEW. Если представление существует, CREATE OR REPLACE VIEW заменяет его.

select_statement представляет собой оператор SELECT, который определяет представление. (Выбор из представления по сути означает использование оператора SELECT.) select_statement может выбирать данные из базовых таблиц или других представлений. Оператор SELECT может использовать оператор VALUES в качестве источника или может быть заменён оператором TABLE, как в операторе CREATE TABLE ... SELECT.

IF NOT EXISTS вызывает создание представления, если оно ещё не существует. Если представление уже существует и IF NOT EXISTS указано, оператор завершается с предупреждением, а не ошибкой; в этом случае определение представления не изменяется. Например:

mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
ERROR 1050 (42S01): Table 'v1' already exists
mysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------+
| Level | Code | Message                   |
+-------+------+---------------------------+
| Note  | 1050 | Table 'v1' already exists |
+-------+------+---------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE VIEW v1\G
*************************** 1. row ***************************
                View: v1
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`vuser`@`localhost` SQL
SECURITY DEFINER VIEW `v1` AS select `t1`.`c1` AS `c1`,`t1`.`c3` AS `c3` from `t1`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

IF NOT EXISTS и OR REPLACE взаимно исключают друг друга и не могут использоваться вместе в одном и том же операторе CREATE VIEW. Попытка сделать это приведёт к отклонению оператора с синтаксической ошибкой.

Сведения о ограничениях на использование представлений см. в разделе 27.10, «Ограничения на использование представлений».

Определение представления «замораживается» в момент создания и не изменяется последующими изменениями определений базовых таблиц. Например, если представление определяется как SELECT * для таблицы, новые столбцы, добавленные в таблицу позднее, не станут частью представления, а удаление столбцов из таблицы приведёт к ошибке при выборке из представления.

Клауз ALGORITHM влияет на обработку представления MySQL. Клаузы DEFINER и SQL SECURITY указывают контекст безопасности, используемый при проверке разрешений при вызове представления. Клауз WITH CHECK OPTION можно использовать для ограничения вставок или обновлений строк в таблицах, на которые ссылается представление. Эти клаузы описаны позже в этом разделе.

Оператор CREATE VIEW требует разрешения CREATE VIEW для представления, а также некоторых разрешений для каждого столбца, выбранного оператором SELECT. Для столбцов, используемых в другом месте оператора SELECT, необходимо разрешение SELECT. Если присутствует клауз OR REPLACE, необходимо также разрешение DROP для представления. Если присутствует клауз DEFINER, требуемые разрешения зависят от значения user, как описано в разделе 27.7, «Управление доступом к хранимым объектам».

При ссылке на представление происходит проверка разрешений, как описано позже в этом разделе.

Представление принадлежит базе данных. По умолчанию новое представление создаётся в базе данных по умолчанию. Чтобы явно создать представление в заданной базе данных, используйте синтаксис db_name.view_name, чтобы указать имя представления с именем базы данных:

CREATE VIEW test.v AS SELECT * FROM t;

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

Внутри базы данных базовые таблицы и представления делят один и тот же пространство имён, поэтому базовая таблица и представление не могут иметь одно и то же имя.

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

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

Представление может быть создано из многих типов операторов SELECT. Оно может ссылаться на базовые таблицы или другие представления. Оно может использовать соединения, оператор UNION и подзапросы. Оператор SELECT даже не должен ссылаться на какие-либо таблицы:

CREATE VIEW v_today (today) AS SELECT CURRENT_DATE;

В следующем примере определено представление, которое выбирает два столбца из другой таблицы, а также выражение, рассчитанное по этим столбцам:

mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+

Определение представления подчиняется следующим ограничениям:

  • Оператор SELECT не может ссылаться на системные переменные или переменные пользователя.

  • Внутри хранимой программы оператор SELECT не может ссылаться на параметры программы или локальные переменные.

  • Оператор SELECT не может ссылаться на параметры подготовленного запроса.

  • Любая таблица или представление, на которую ссылается определение, должны существовать. Если после создания представления таблица или представление, на которые ссылается определение, удалены, использование представления приводит к ошибке. Чтобы проверить определение представления на наличие проблем такого рода, используйте оператор CHECK TABLE.

  • Определение не может ссылаться на TEMPORARY таблицу, и вы не можете создать TEMPORARY представление.

  • Нельзя ассоциировать триггер с представлением.

  • Псевдонимы для имён столбцов в операторе SELECT проверяются по максимальной длине столбца 64 символа (а не по максимальной длине псевдонима 256 символов).

ORDER BY разрешено в определении представления, но игнорируется, если вы выбираете из представления с помощью оператора, имеющего свой ORDER BY.

Для других параметров или клаузов в определении они добавляются к параметрам или клаузам оператора, который ссылается на представление, но эффект не определён. Например, если определение представления включает клауз LIMIT, и вы выбираете из представления с помощью оператора, имеющего свой клауз LIMIT, то неясно, какой лимит применяется. Этот же принцип применим к параметрам, таким как ALL, DISTINCT или SQL_SMALL_RESULT, которые следуют за ключевым словом SELECT, и к клаузам, таким как INTO, FOR UPDATE, FOR SHARE, LOCK IN SHARE MODE и PROCEDURE.

Результаты, полученные из представления, могут измениться, если вы измените среду обработки запросов, изменив системные переменные:

mysql> CREATE VIEW v (mycol) AS SELECT 'abc';
Query OK, 0 rows affected (0.01 sec)

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT "mycol" FROM v;
+-------+
| mycol |
+-------+
| mycol |
+-------+
1 row in set (0.01 sec)

mysql> SET sql_mode = 'ANSI_QUOTES';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT "mycol" FROM v;
+-------+
| mycol |
+-------+
| abc   |
+-------+
1 row in set (0.00 sec)

Клаузы DEFINER и SQL SECURITY определяют учётную запись MySQL, используемую при проверке разрешений для представления при выполнении оператора, ссылающегося на представление. Допустимые значения характеристики SQL SECURITY — DEFINER (по умолчанию) и INVOKER. Они указывают, что необходимые привилегии должны быть у пользователя, который определил или вызвал представление, соответственно.

Если присутствует клауз DEFINER, значение user должно быть учётной записью MySQL, указанной как 'user_name'@'host_name', CURRENT_USER или CURRENT_USER(). Разрешенные значения user зависят от имеющихся у вас привилегий, как описано в разделе 27.7, «Управление доступом к хранимым объектам». Также см. этот раздел для дополнительной информации о безопасности представлений.

Если клауз DEFINER опущен, по умолчанию определяем пользователем, который выполняет оператор CREATE VIEW. Это то же самое, что явно указать DEFINER = CURRENT_USER.

END_OF_DOCUMENT_MARKER

В определении представления функция CURRENT_USER по умолчанию возвращает значение DEFINER представления. Для представлений, определённых с характеристикой SQL SECURITY INVOKER, функция CURRENT_USER возвращает учётную запись вызывающего представление. Для получения информации об аудировании пользователей в представлениях, см. Раздел 8.2.23, «Аудирование активности учётных записей на основе SQL».

В хранимой процедуре, определённой с характеристикой SQL SECURITY DEFINER, функция CURRENT_USER возвращает значение DEFINER процедуры. Это также влияет на представление, определённое внутри такой процедуры, если определение представления содержит значение DEFINER CURRENT_USER.

MySQL проверяет привилегии на представления следующим образом:

  • В момент определения представления создатель представления должен иметь привилегии, необходимые для использования верхнеуровневых объектов, к которым обращается представление. Например, если определение представления ссылается на столбцы таблицы, создатель должен иметь определённые привилегии для каждого столбца в списке выбора определения и привилегию SELECT для каждого столбца, используемого в другом месте определения. Если определение ссылается на хранимую функцию, проверяются только привилегии, необходимые для вызова функции. Привилегии, необходимые во время вызова функции, проверяются только во время её выполнения: для разных вызовов могут быть пройдены разные пути выполнения внутри функции.

  • Пользователь, ссылающийся на представление, должен иметь соответствующие привилегии для доступа к нему (SELECT для выбора из него, INSERT для вставки в него и т. д.).

  • Когда представление было использовано, привилегии для объектов, к которым обращается представление, проверяются относительно привилегий учётной записи представления DEFINER или вызывающего, в зависимости от того, является ли характеристика SQL SECURITY DEFINER или INVOKER соответственно.

  • Если обращение к представлению вызывает выполнение хранимой функции, проверка привилегий для инструкций, выполняемых внутри функции, зависит от того, является ли функция SQL SECURITY характеристикой DEFINER или INVOKER. Если характеристика безопасности равна DEFINER, функция выполняется с привилегиями учётной записи DEFINER. Если характеристика равна INVOKER, функция выполняется с привилегиями, определяемыми характеристикой SQL SECURITY представления.

Пример: представление может зависеть от хранимой функции, а эта функция может вызывать другие хранимые процедуры. Например, следующее представление вызывает хранимую функцию f():

CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);

Предположим, что f() содержит инструкцию такого типа:

IF name IS NULL then
  CALL p1();
ELSE
  CALL p2();
END IF;

При выполнении f() необходимо проверить привилегии, необходимые для выполнения инструкций внутри f(). Это может означать, что требуются привилегии для p1() или p2(), в зависимости от пути выполнения внутри f(). Эти привилегии должны быть проверены во время выполнения, и пользователь, который должен обладать этими привилегиями, определяется значениями SQL SECURITY представления v и функции f().

Определения DEFINER и SQL SECURITY для представлений являются расширениями стандартного SQL. В стандартном SQL представления обрабатываются по правилам для SQL SECURITY DEFINER. Стандарт гласит, что определяющий представление (то же самое, что и владелец схемы представления) получает применимые привилегии на представление (например, SELECT) и может их предоставить. В MySQL нет понятия «владельца» схемы, поэтому MySQL добавляет условие для идентификации определяющего пользователя. Условие DEFINER является расширением, которое предназначено для реализации того, что имеет стандарт, то есть постоянная запись о том, кто определил представление. Вот почему значение по умолчанию DEFINER — это учётная запись создателя представления.

Необязательное условие ALGORITHM является расширением MySQL к стандартному SQL. Оно влияет на то, как MySQL обрабатывает представление. ALGORITHM принимает три значения: MERGE, TEMPTABLE или UNDEFINED. Более подробную информацию см. в Разделе 27.6.2, «Алгоритмы обработки представлений», а также в Разделе 10.2.2.4, «Оптимизация производных таблиц, ссылок на представления и выражений с общими таблицами с помощью слияния или материализации».

Некоторые представления обновляемые. Это означает, что вы можете использовать их в инструкциях, таких как UPDATE, DELETE или INSERT, чтобы обновить содержимое базовой таблицы. Для того, чтобы представление было обновляемым, должно существовать взаимно однозначное соответствие между строками в представлении и строками в базовой таблице. Также существуют другие конструкции, которые делают представление не обновляемым.

Сгенерированный столбец в представлении считается обновляемым, так как ему можно присвоить значение. Однако, если такой столбец обновляется явно, единственно допустимым значением является DEFAULT. Для получения информации о сгенерированных столбцах см. Раздел 15.1.21.8, «CREATE TABLE и сгенерированные столбцы».

Условие WITH CHECK OPTION может быть указано для обновляемого представления, чтобы предотвратить вставки или обновления строк, кроме тех, для которых условие WHERE в select_statement истинно.

В условии WITH CHECK OPTION для обновляемого представления ключевые слова LOCAL и CASCADED определяют область проверки при определении представления в терминах другого представления. Ключевое слово LOCAL ограничивает CHECK OPTION только определенным представлением. Ключевое слово CASCADED заставляет также оценивать проверки для базовых представлений. При отсутствии обоих ключевых слов, значение по умолчанию — CASCADED.

Для получения дополнительной информации об обновляемых представлениях и условии WITH CHECK OPTION см. Раздел 27.6.3, «Обновляемые и вставляемые представления» и Раздел 27.6.4, «Условие WITH CHECK OPTION для представлений».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/create-view.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API