15.1.23 Оператор 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 VIEW создаёт новую представление или заменяет существующую, если указан клауз OR
REPLACE. Если представление не существует, CREATE OR REPLACE
VIEW эквивалентен CREATE
VIEW. Если представление существует, CREATE OR REPLACE
VIEW заменяет его.
Сведения о ограничениях использования представлений см. в Разделе 27.9, «Ограничения на представления».
select_statement — это оператор SELECT, который определяет представление. (Выбор из представления фактически выполняется с помощью оператора SELECT.) select_statement может выбирать данные из базовых таблиц или других представлений. Оператор SELECT может использовать оператор VALUES в качестве источника или быть заменён оператором TABLE, как в случае CREATE TABLE
... SELECT.
Определение представления «замораживается» во время создания и не изменяется последующими изменениями определений базовых таблиц. Например, если представление определено как SELECT * для таблицы, новые колонки, добавленные в таблицу позже, не станут частью представления, а удалённые колонки приведут к ошибке при выборе из представления.
Клауз ALGORITHM влияет на обработку представления MySQL. Клаузы DEFINER и SQL SECURITY определяют контекст безопасности, используемый при проверке разрешений при вызове представления. Клауза WITH CHECK OPTION может быть добавлена для ограничения вставки или обновления строк в таблицах, на которые ссылается представление. Эти клаузы описаны далее в этом разделе.
Оператор CREATE VIEW требует разрешения CREATE VIEW на представление и определённые разрешения на каждую колонку, выбранную оператором SELECT. Для колонок, используемых в других частях оператора SELECT, необходимо разрешение SELECT. Если присутствует клауз OR REPLACE, необходимо также разрешение DROP на представление. Если присутствует клауз DEFINER, требуемые разрешения зависят от значения user, как описано в Разделе 27.6, «Управление доступом к хранимым объектам».
При ссылке на представление происходит проверка разрешений, как описано далее в этом разделе.
Представление принадлежит базе данных. По умолчанию новое представление создаётся в текущей базе данных. Чтобы явно создать представление в заданной базе данных, используйте синтаксис 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.6, «Управление доступом к хранимым объектам». Дополнительную информацию о безопасности представлений также см. в этом разделе.
Если клауз DEFINER опущен, по умолчанию определяется пользователь, который выполнил оператор CREATE
VIEW. Это то же самое, что и явное указание DEFINER = CURRENT_USER.
Внутри определения представления функция 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.5.2 «Алгоритмы обработки представлений», а также в разделе 10.2.2.4 «Оптимизация производных таблиц, ссылок на представления и общих табличных выражений с помощью объединения или материализации».
Некоторые представления являются обновляемыми. То есть, вы можете использовать их в операторах, таких как UPDATE, DELETE или INSERT для обновления содержимого базовой таблицы. Для того, чтобы представление было обновляемым, должно быть взаимно однозначное соответствие между строками в представлении и строками в базовой таблице. Также существуют другие конструкции, которые делают представление неудобным для обновления.
Сгенерированный столбец в представлении считается обновляемым, потому что в него можно назначить значения. Однако, если такой столбец обновляется явно, единственно допустимое значение — DEFAULT. Более подробную информацию о сгенерированных столбцах см. в разделе 15.1.20.8 «CREATE TABLE и сгенерированные столбцы».
Для обновляемого представления можно указать оператор WITH CHECK OPTION, чтобы предотвратить вставки или обновления строк, за исключением тех, для которых оператор WHERE в select_statement верен.
В операторе WITH CHECK OPTION для обновляемого представления ключевые слова LOCAL и CASCADED определяют область проверки при определении представления в терминах другого представления. Ключевое слово LOCAL ограничивает проверку только для определенного представления. Ключевое слово CASCADED заставляет также проверять базовые представления. Если ни одно из ключевых слов не указано, используется значение по умолчанию — CASCADED.
Для получения дополнительной информации об обновляемых представлениях и операторе WITH
CHECK OPTION см. раздел 27.5.3 «Обновляемые и вставляемые представления» и раздел 27.5.4 «Оператор WITH CHECK OPTION для представления».
© 2025 Oracle
Licensed under the GPLv2 License.