23.5.4 Оператор WITH CHECK OPTION для представлений
Оператор WITH CHECK OPTION может быть задан для обновляемого представления, чтобы предотвратить вставки строк, для которых условие CHECK в select_statement не выполняется. Он также предотвращает обновление строк, для которых условие CHECK истинно, но обновление приведет к тому, что оно станет ложным (другими словами, он предотвращает обновление видимых строк до невидимых строк).
В операторе WITH CHECK OPTION для обновляемого представления ключевые слова LOCAL и CASCADED определяют область проверки, когда представление определяется через другое представление. Если ни одно из этих ключевых слов не указано, по умолчанию используется CASCADED.
До MySQL 5.7.6, проверка с использованием WITH CHECK OPTION работала следующим образом:
С помощью
LOCAL, проверяется условие CHECK представленияWHERE, но проверки для подчинённых представлений не выполняются.С помощью
CASCADED, проверяется условие CHECK представленияWHERE, затем проверка рекурсивно распространяется на подчинённые представления, добавляетWITH CASCADED CHECK OPTIONк ним (для целей проверки; их определения остаются без изменений) и применяет те же правила.Без опции CHECK условие CHECK представления
WHEREне проверяется, и проверки для подчинённых представлений не выполняются.
Начиная с MySQL 5.7.6, проверка WITH CHECK OPTION соответствует стандарту (с изменённой семантикой по сравнению с предыдущими версиями для LOCAL и отсутствием условия CHECK):
С помощью
LOCAL, проверяется условие CHECK представленияWHERE, затем проверка рекурсивно распространяется на подчинённые представления и применяет те же правила.С помощью
CASCADED, проверяется условие CHECK представленияWHERE, затем проверка рекурсивно распространяется на подчинённые представления, добавляетWITH CASCADED CHECK OPTIONк ним (для целей проверки; их определения остаются без изменений) и применяет те же правила.Без опции CHECK условие CHECK представления
WHEREне проверяется, затем проверка рекурсивно распространяется на подчинённые представления и применяет те же правила.
Рассмотрим определения следующей таблицы и набора представлений:
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
WITH CHECK OPTION;
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
WITH LOCAL CHECK OPTION;
CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
WITH CASCADED CHECK OPTION;
Здесь представления v2 и v3 определены через другое представление v1. До MySQL 5.7.6, так как представление v2 имеет опцию CHECK WITH, вставки проверяются только по условию CHECK представления v2. Представление v3 имеет опцию CHECK WITH, поэтому вставки проверяются не только по условию CHECK представления v3, но и по условиям подчинённых представлений. Следующие операторы иллюстрируют эти различия:
mysql> INSERT INTO v2 VALUES (2);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'
Начиная с MySQL 5.7.6, семантика LOCAL отличается от предыдущих версий: Вставки для представления v2 проверяются по его опции CHECK, затем (в отличие от версий до 5.7.6) проверка распространяется на v1, и правила применяются повторно. Правила для v1 приводят к отказу проверки. Проверка для v3 отклоняется, как и прежде:
mysql> INSERT INTO v2 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v2'
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'
© 2025 Oracle
Licensed under the GPLv2 License.