WITH CHECK OPTION
可以为可更新视图提供该子句,以防止插入到
子句WHERE
不
select_statement
正确的行。它还会阻止更新WHERE
子句为真但更新会导致它不为真的行(换句话说,它会阻止可见行更新为不可见行)。
在WITH CHECK OPTION
可更新视图的子句中,LOCAL
和CASCADED
关键字确定根据另一个视图定义视图时检查测试的范围。当两个关键字都没有给出时,默认为CASCADED
.
WITH CHECK OPTION
测试符合标准:
使用
LOCAL
,检查视图WHERE
子句,然后检查递归到基础视图并应用相同的规则。使用
CASCADED
,检查视图WHERE
子句,然后检查递归到基础视图,添加WITH CASCADED CHECK OPTION
到它们(为了检查的目的;它们的定义保持不变),并应用相同的规则。如果没有检查选项,则不检查视图
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
。
v2
针对其
检查选项检查
插入LOCAL
,然后检查递归到
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'