Oracle With Check Option

2019-10-16 22:05:47

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