在本教學中,您將學習使用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;
我們將使用可更新檢視教學中建立的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
子句來確保檢視的一致性。