在本教程中,您将学习使用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示例
我们将使用可更新视图教程中创建的brands
和cars
表进行演示。
以下图片展示了brands
和cars
表中的数据:
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
子句来确保视图的一致性。