先前定義的 NONFICTIONBOOKS 視圖只包含 BOOKTYPE 為 N 的行。如果向這個視圖中插入一個 BOOKTYPE 為 F 的行,DB2 將把該行插入到基表 BOOKS 中。但是,如果以后從視圖中進行選擇,通過該視圖卻看不到新插入的行。如果不想允許用戶插入視圖范圍以外的行,那么在定義視圖時可以使用檢查選項。使用 WITH CHECK OPTION 定義視圖會讓 DB2 檢查使用視圖的語句是否滿足視圖的條件。
下面的語句用 WITH CHECK OPTION 定義一個視圖:
CREATE VIEW NONFICTIONBOOKS AS
SELECT * FROM BOOKS WHERE BOOKTYPE = 'N'
WITH CHECK OPTION
這個視圖仍然限制用戶只能看到非小說類的書;另外,它還防止用戶插入 BOOKTYPE 列的值不為 N 的行,并防止把現有行中 BOOKTYPE 列的值更新為 N 以外的值。例如,下列語句將不再允許使用:
INSERT INTO NONFICTIONBOOKS VALUES (...,'F');
UPDATE NONFICTIONBOOKS SET BOOKTYPE = 'F' WHERE BOOKID = 111
在定義嵌套視圖時,檢查選項可以用于限制操作。但是,還可以指定其他子句來定義如何繼承限制。檢查選項可以定義為 CASCADED 或 LOCAL。如果沒有指定關鍵字,CASCADED 是默認值。為說明 CASCADED 和 LOCAL 行為的不同,我們來看幾個可能的場景。
當用 WITH CASCADED CHECK OPTION 創建視圖時,所有針對該視圖執行的語句都必須滿足視圖和所有底層視圖的條件 —— 即使那些視圖不是帶檢查選項定義的,也是如此。假設在創建 NONFICTIONBOOKS 時沒有帶檢查選項,也可以使用 CASCADED 關鍵字在視圖 NONFICTIONBOOKS 的基礎上創建視圖 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 語句,因為它們不滿足其中至少一個視圖的條件:
INSERT INTO NONFICTIONBOOKS1 VALUES( 10,..,'N')
INSERT INTO NONFICTIONBOOKS1 VALUES(120,..,'F')
INSERT INTO NONFICTIONBOOKS1 VALUES( 10,..,'F')
但是,會 允許下面的 INSERT 語句,因為這兩個視圖的條件它都滿足:
INSERT INTO NONFICTIONBOOKS1 VALUES(120,...,'N')
接下來,假設用 WITH LOCAL CHECK OPTION 在視圖 NONFICTIONBOOKS 的基礎上創建視圖 NONFICTIONBOOKS2。現在,針對這個視圖執行的語句只需要滿足指定了檢查選項的視圖的條件:
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 語句,因為它們不滿足 NONFICTIONBOOKS2 視圖的 BOOKID > 100 這個條件:
INSERT INTO NONFICTIONBOOKS2 VALUES(10,..,'N')
INSERT INTO NONFICTIONBOOKS2 VALUES(10,..,'F')
但是,盡管值 N 不滿足 NONFICTIONBOOKS 視圖的 BOOKTYPE = 'N' 這個條件,也會允許下面的 INSERT 語句:
INSERT INTO NONFICTIONBOOKS2 VALUES(120,..,'N')
INSERT INTO NONFICTIONBOOKS2 VALUES(120,..,'F')