先前定義的 NONFICTIONBOOKS 視圖只包含 BOOKTYPE 為 N 的行。如果向這個(gè)視圖中插入一個(gè) BOOKTYPE 為 F 的行,DB2 將把該行插入到基表 BOOKS 中。但是,如果以后從視圖中進(jìn)行選擇,通過(guò)該視圖卻看不到新插入的行。如果不想允許用戶(hù)插入視圖范圍以外的行,那么在定義視圖時(shí)可以使用檢查選項(xiàng)。使用 WITH CHECK OPTION 定義視圖會(huì)讓 DB2 檢查使用視圖的語(yǔ)句是否滿(mǎn)足視圖的條件。
下面的語(yǔ)句用 WITH CHECK OPTION 定義一個(gè)視圖:
CREATE VIEW NONFICTIONBOOKS AS
SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
WITH CHECK OPTION
這個(gè)視圖仍然限制用戶(hù)只能看到非小說(shuō)類(lèi)的書(shū);另外,它還防止用戶(hù)插入 BOOKTYPE 列的值不為 N 的行,并防止把現(xiàn)有行中 BOOKTYPE 列的值更新為 N 以外的值。例如,下列語(yǔ)句將不再允許使用:
INSERT INTO NONFICTIONBOOKS VALUES (...,'F');
UPDATE NONFICTIONBOOKS SET BOOKTYPE = 'F' WHERE BOOKID = 111
在定義嵌套視圖時(shí),檢查選項(xiàng)可以用于限制操作。但是,還可以指定其他子句來(lái)定義如何繼承限制。檢查選項(xiàng)可以定義為 CASCADED 或 LOCAL。如果沒(méi)有指定關(guān)鍵字,CASCADED 是默認(rèn)值。為說(shuō)明 CASCADED 和 LOCAL 行為的不同,我們來(lái)看幾個(gè)可能的場(chǎng)景。
當(dāng)用 WITH CASCADED CHECK OPTION 創(chuàng)建視圖時(shí),所有針對(duì)該視圖執(zhí)行的語(yǔ)句都必須滿(mǎn)足視圖和所有底層視圖的條件 —— 即使那些視圖不是帶檢查選項(xiàng)定義的,也是如此。假設(shè)在創(chuàng)建 NONFICTIONBOOKS 時(shí)沒(méi)有帶檢查選項(xiàng),也可以使用 CASCADED 關(guān)鍵字在視圖 NONFICTIONBOOKS 的基礎(chǔ)上創(chuàng)建視圖 NONFICTIONBOOKS1:
CREATE VIEW NONFICTIONBOOKS AS
SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
CREATE VIEW NONFICTIONBOOKS1 AS
SELECT * FROM NONFICTIONBOOKS WHERE BOOKID > 100
WITH CASCADED CHECK OPTION
將不允許下列 INSERT 語(yǔ)句,因?yàn)樗鼈儾粷M(mǎn)足其中至少一個(gè)視圖的條件:
INSERT INTO NONFICTIONBOOKS1 VALUES( 10,..,'N')
INSERT INTO NONFICTIONBOOKS1 VALUES(120,..,'F')
INSERT INTO NONFICTIONBOOKS1 VALUES( 10,..,'F')
但是,會(huì) 允許下面的 INSERT 語(yǔ)句,因?yàn)檫@兩個(gè)視圖的條件它都滿(mǎn)足:
INSERT INTO NONFICTIONBOOKS1 VALUES(120,...,'N')
接下來(lái),假設(shè)用 WITH LOCAL CHECK OPTION 在視圖 NONFICTIONBOOKS 的基礎(chǔ)上創(chuàng)建視圖 NONFICTIONBOOKS2。現(xiàn)在,針對(duì)這個(gè)視圖執(zhí)行的語(yǔ)句只需要滿(mǎn)足指定了檢查選項(xiàng)的視圖的條件:
CREATE VIEW NONFICTIONBOOKS AS
SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
CREATE VIEW NONFICTIONBOOKS2 AS
SELECT * FROM NONFICTIONBOOKS WHERE BOOKID > 100
WITH LOCAL CHECK OPTION
在這種情況下,將不允許下面的 INSERT 語(yǔ)句,因?yàn)樗鼈儾粷M(mǎn)足 NONFICTIONBOOKS2 視圖的 BOOKID > 100 這個(gè)條件:
INSERT INTO NONFICTIONBOOKS2 VALUES(10,..,'N')
INSERT INTO NONFICTIONBOOKS2 VALUES(10,..,'F')
但是,盡管值 N 不滿(mǎn)足 NONFICTIONBOOKS 視圖的 BOOKTYPE = 'N' 這個(gè)條件,也會(huì)允許下面的 INSERT 語(yǔ)句:
INSERT INTO NONFICTIONBOOKS2 VALUES(120,..,'N')
INSERT INTO NONFICTIONBOOKS2 VALUES(120,..,'F')