WITH CHECK OPTION条款可以给出一个可更新视图来防止插入到行的量, WHERE在该条款 select_statement是不正确的。它还可以防止对WHERE 子句为true的行进行更新,但是更新将导致该行为true(换句话说,它防止将可见行更新为不可见行)。
在WITH CHECK OPTION可更新视图的子句中, 当根据另一个视图定义该视图时,LOCALand CASCADED关键字确定检查测试的范围。如果未指定任何关键字,则默认为CASCADED。
WITH CHECK OPTION 测试符合标准:
使用LOCAL,将WHERE检查view 子句,然后检查对基础视图的递归并应用相同的规则。
使用CASCADED,将WHERE检查view 子句,然后检查对基础视图的递归,将WITH CASCADED CHECK OPTION其添加到视图中(出于检查的目的;其定义保持不变),并应用相同的规则。
如果没有检查选项,则不检查view 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'