在WITH CHECK OPTION子句中的LOCAL&CASCADED

时间:2019-11-20 08:52:14  来源:igfitidea点击:

简介:在本教程中,您将在WITH CHECK OPTION子句中了解LOCAL和CASCADED之间的区别。

请注意,在继续本教程之前,您应该熟悉WITH CHECK OPTION子句。
如果不是这种情况,可以遵循WITH CHECK OPTION教程。

本地和级联检查范围介绍

当您使用WITH CHECK OPTION子句创建视图并针对该视图发出DML语句(例如INSERT,UPDATE和DELETE)时,MySQL会检查以确保要更改的行符合该视图的定义。

由于可以基于其他视图创建视图,因此MySQL还会检查从属视图中的规则以确保数据一致性。

为了确定检查范围,MySQL提供了两个选项:LOCAL和CASCADED。
如果您没有在WITH CHECK OPTION子句中明确指定关键字,则MySQL默认使用CASCADED。

具有级联检查选项的MySQL

考虑以下示例,以了解WITH CASCADED CHECK OPTION的效果:

首先,创建一个名为t1的表,该表的一列c的数据类型为整数。

CREATE TABLE t1 (
    c INT
);

接下来,基于t1表创建视图v1,其中c列中的数据大于10。

CREATE OR REPLACE VIEW v1 
AS
    SELECT 
        c
    FROM
        t1
    WHERE
        c > 10;

因为我们没有指定WITH CHECK OPTION,所以以下语句即使不符合v1视图的定义也可以工作。

INSERT INTO v1(c) 
VALUES (5);

然后,使用WITH CASCADED CHECK OPTION子句基于v1视图创建视图v2。

CREATE OR REPLACE VIEW v2 
AS
    SELECT c FROM v1 
WITH CASCADED CHECK OPTION;

现在,通过v2视图将值5的行插入t1表中。

INSERT INTO v2(c) 
VALUES (5);

MySQL发出以下错误消息:

Error Code: 1369. CHECK OPTION failed 'classicmodels.v2'

它会使不符合v2视图定义的新行失败。

之后,基于v2创建一个名为v3的新视图。

CREATE OR REPLACE VIEW v3 
AS
    SELECT c
    FROM v2
    WHERE c < 20;

通过v3视图将新行插入t1表中,值为8。

INSERT INTO v3(c) 
VALUES (8);

MySQL发出以下错误消息:

Error Code: 1369. CHECK OPTION failed 'classicmodels.v3'

即使该行似乎符合v3视图的定义,insert语句也会失败。

因为视图v3依赖于v2视图,并且v2视图具有选项WITH CASCADED CHECK OPTION。

但是,以下插入语句有效。

INSERT INTO v3(c) VALUES (30);

因为v3视图没有WITH CHECK OPTION,并且该语句符合v2视图的定义。

总之,当视图使用WITH CASCADED CHECK OPTION时,MySQL会递归地检查视图规则和基础视图规则。

具有本地检查选项的MySQL

让我们将上面的相同示例用于WITH LOCAL CHECK OPTION,以查看不同之处。

首先,将v2视图更改为使用WITH LOCAL CHECK OPTION。

ALTER VIEW v2 AS
    SELECT 
        c
    FROM
        v1 
WITH LOCAL CHECK OPTION;

其次,插入与上面示例相同的行。

INSERT INTO v2(c) 
VALUES (5);

成功了。

因为v2视图没有任何规则。
视图v2依赖于v1视图。
但是,v1视图未指定检查选项,因此,MySQL跳过了v1视图中的规则检查。

请注意,在使用WITH CASCADED CHECK OPTION创建的v2视图中,该语句失败。

第三,通过v3视图在t1表中插入同一行。

INSERT INTO v3(c) VALUES (8);

在这种情况下它成功了,因为由于v2视图的WITH LOCAL CHECK OPTION,MySQL没有检查v1视图的规则。

此外,请注意,此语句在v2使用WITH CASCADED CHECK OPTION创建的示例中失败。

因此,如果视图使用WITH LOCAL CHECK OPTION,MySQL会检查具有WITH LOCAL CHECK OPTION和CASCASED CHECK OPTION的视图规则。

它与使用WITH WITH CASCADED CHECK OPTION的视图不同,MySQL会检查所有从属视图的规则。

请注意,在MySQL 5.7.6之前,如果您使用带有WITH LOCAL CHECK OPTION的视图,则MySQL仅检查当前视图的规则,而不检查基础视图的规则。