在本教學中,您將學習使用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
子句來確保視圖的一致性。