13.1.21 Оператор 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 заменяет его.
Сведения о ограничениях использования представлений см. в Разделе 23.9, «Ограничения на использование представлений».
select_statement — это оператор SELECT, определяющий представление. (Выбор из представления фактически эквивалентен выполнению оператора SELECT). select_statement может выбирать данные из базовых таблиц или других представлений.
Определение представления замораживается во время создания и не изменяется при последующих изменениях в определениях базовых таблиц. Например, если представление определено как SELECT * по отношению к таблице, новые столбцы, добавленные в таблицу позже, не станут частью представления, а удаление столбцов из таблицы приведёт к ошибке при выборке из представления.
Клауза ALGORITHM влияет на то, как MySQL обрабатывает представление. Клаузы DEFINER и SQL SECURITY указывают контекст безопасности, который используется при проверке прав доступа во время вызова представления. Клауза WITH CHECK OPTION может быть использована для ограничения вставки или обновления строк в таблицах, на которые ссылается представление. Эти клаузы описаны далее в данном разделе.
Для использования оператора CREATE VIEW необходимо иметь право CREATE VIEW для представления и некоторые права на каждый столбец, выбранный оператором SELECT. Для столбцов, используемых в другом месте оператора SELECT, необходимо право SELECT. Если присутствует клаузу OR REPLACE, необходимо также иметь право DROP для представления. Если присутствует клаузу DEFINER, необходимые права зависят от значения user, как описано в Разделе 23.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, 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 зависят от ваших прав доступа, как описано в Разделе 23.6, «Управление доступом к хранимым объектам». Также см. этот раздел для дополнительной информации о безопасности представлений.
Если клаузу DEFINER опущено, значение по умолчанию — пользователь, который выполняет оператор CREATE
VIEW. Это эквивалентно явному указанию DEFINER = CURRENT_USER.
Внутри определения представления функция CURRENT_USER по умолчанию возвращает значение DEFINER представления. Для представлений, определённых с характеристикой SQL SECURITY INVOKER, функция CURRENT_USER возвращает учётную запись вызывающего представление.
Для получения информации об аудировании пользователей в представлениях см. Раздел 6.2.18, «Аудирование активности учётных записей на основе 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. Дополнительную информацию см. в разделе 23.5.2 «Алгоритмы обработки представлений», а также в разделе 8.2.2.4 «Оптимизация производных таблиц и ссылок на представления с объединением или материализацией».
Некоторые представления обновляемы. То есть, вы можете использовать их в операторах, таких как UPDATE, DELETE или INSERT для обновления содержимого основной таблицы. Для того, чтобы представление было обновляемым, должно быть взаимно однозначное соответствие между строками в представлении и строками в основной таблице. Есть также некоторые другие конструкции, которые делают представление не обновляемым.
Сгенерированный столбец в представлении считается обновляемым, потому что в него можно присвоить значение. Однако, если такой столбец обновляется явно, единственное разрешённое значение — DEFAULT. Дополнительную информацию о сгенерированных столбцах см. в разделе 13.1.18.7 «CREATE TABLE и сгенерированные столбцы».
Для обновляемого представления предложение WITH CHECK OPTION может быть задано для предотвращения вставки или обновления строк, кроме тех, для которых предложение WHERE в select_statement истинно.
В предложении WITH CHECK OPTION для обновляемого представления ключевые слова LOCAL и CASCADED определяют область проверки при определении представления в терминах другого представления. Ключевое слово LOCAL ограничивает проверки CHECK OPTION только для определяемого представления. CASCADED вызывает оценку проверок для базовых представлений. Если ни одно ключевое слово не указано, используется значение по умолчанию — CASCADED.
Дополнительную информацию об обновляемых представлениях и предложении WITH
CHECK OPTION см. в разделе 23.5.3 «Обновляемые и вставляемые представления» и разделе 23.5.4 «Предложение WITH CHECK OPTION для представления».
Представления, созданные до MySQL 5.7.3, содержащие ORDER BY
, могут привести к ошибкам во время оценки представления. Рассмотрим определения представлений, которые используют integerORDER BY с порядковым номером:
CREATE VIEW v1 AS SELECT x, y, z FROM t ORDER BY 2;
CREATE VIEW v2 AS SELECT x, 1, z FROM t ORDER BY 2;
В первом случае ORDER BY 2 ссылается на именованный столбец y. Во втором случае — на константу 1. Для запросов, выбирающих из представления меньше 2 столбцов (число, указанное в предложении ORDER BY), возникает ошибка, если сервер оценивает представление с помощью алгоритма MERGE. Примеры:
mysql> SELECT x FROM v1;
ERROR 1054 (42S22): Unknown column '2' in 'order clause'
mysql> SELECT x FROM v2;
ERROR 1054 (42S22): Unknown column '2' in 'order clause'
Начиная с MySQL 5.7.3, для обработки определений представлений такого типа сервер записывает их по-другому в файл .frm, который хранит определение представления. Это различие видно с помощью SHOW CREATE VIEW. Ранее файл .frm содержал следующее для предложения ORDER BY 2:
For v1: ORDER BY 2
For v2: ORDER BY 2
Начиная с 5.7.3, файл .frm содержит следующее:
For v1: ORDER BY `t`.`y`
For v2: ORDER BY ''
То есть, для v1, 2 заменяется ссылкой на имя столбца, к которому относится ссылка. Для v2, 2 заменяется выражением константы строки (упорядочивание по константе не имеет эффекта, поэтому упорядочивание по любой константе работает).
Если у вас возникают ошибки при оценке представления, как описано выше, удалите и пересоздайте представление, чтобы файл .frm содержал обновлённое представление. В качестве альтернативы, для представлений, таких как v2, которые упорядочивают по константе, удалите и пересоздайте представление без предложения ORDER BY.
© 2025 Oracle
Licensed under the GPLv2 License.