Oracle With Check Option

在本教程中,您将学习使用Oracle WITH CHECK OPTION子句来确保视图的一致性。

Oracle WITH CHECK OPTION子句

WITH CHECK OPTION子句用于可更新视图,以禁止更改视图,以生成未包含在定义查询中的行。

以下语句将创建一个具有满足WHERE子句条件的行的视图。

CREATE
    VIEW view_name AS SELECT
        *
    FROM
        table_name
    WHERE
        condition;

如果视图是可更新的,则可以更新行以使其在视图中不可见,或者可以插入使WHERE子句中的条件不成立的新行。

为防止不可见行被更新为不可见行,可以使用WITH CHECK OPTION子句:

CREATE
    VIEW view_name AS SELECT
        *
    FROM
        table_name
    WHERE
        condition WITH CHECK OPTION;

Oracle WITH CHECK OPTION示例

我们将使用可更新视图教程中创建的brandscars表进行演示。

以下图片展示了brandscars表中的数据:

SELECT
 *
FROM
 brands;

执行上面查询语句,得到以下结果 -

cars表中的数据如下 -

SELECT
 *
FROM
 cars;

执行上面查询语句,得到以下结果 -

以下语句创建仅返回奥迪轿车的audi_cars视图:

CREATE
    VIEW audi_cars AS SELECT
        car_id,
        car_name,
        brand_id
    FROM
        cars
    WHERE
        brand_id = 1;

以下查询返回audi_cars视图中的数据:

SELECT
    *
FROM
    audi_cars;

执行上面查询语句,得到以下结果 -

audi_cars是一个可更新的视图,所以可以通过它插入一个新的行cars表:

INSERT
    INTO
        audi_cars(
            car_name,
            brand_id
        )
    VALUES(
        'BMW Z3 coupe',
        2
    );

该语句插入一行,使WHERE子句(brand_id = 1)中的条件不成立。

还可以通过视图更新底层基表中的数据,使视图中的可见行不可见,如以下示例所示:

UPDATE
    audi_cars
SET
    car_name = 'BMW 1-serie Coupe',
    brand_id = 2
WHERE
    car_id = 3;

这个语句改变了一辆汽车的品牌和名称(从奥迪修改为宝马),使得该行在视图中不可见。

SELECT
    *
FROM
    audi_cars;

执行上面查询语句,得到以下结果 -

让我们创建另一个名为ford_cars的可更新视图,该视图具有WITH CHECK OPTION子句:

CREATE
    VIEW ford_cars AS SELECT
        car_id,
        car_name,
        brand_id
    FROM
        cars
    WHERE
        brand_id = 3 WITH CHECK OPTION;

以下语句通过ford_cars视图将Audi汽车插入到cars表中:

INSERT
    INTO
        ford_cars(
            car_name,
            brand_id
        )
    VALUES(
        'Audi RS6 Avant',
        1
    );

audi_cars视图不同,Oracle在这种情况下发出以下错误:

SQL Error: ORA-01402: view WITH CHECK OPTION where-clause violation

因为INSERT语句试图插入一个导致视图WITH CHECK OPTION where子句违反条件的行。

同样,下面的UPDATE语句也由于where子句违反而无法更新。

UPDATE
    ford_cars
SET
    brand_id = 4,
    car_name = 'Honda NSX'
WHERE
    car_id = 6;

在本教程中,您已经学习了如何在CREATE VIEW语句中使用Oracle WITH CHECK OPTION子句来确保视图的一致性。


上一篇: Oracle检查约束 下一篇: Oracle过程