9.3.2 视图CHECK OPTION设置

在某些情况下允许修改视图的数据,修改数据的本质是修改视图源表的数据。假如某个视图查询出来的是年龄大于20的所有数据,如果为该视图增加一条年龄为10的记录,那么该记录将不会出现在视图中。显然这是不符合逻辑的。为了避免这种情况的发生,可以利用CHECK OPTION选项来设置视图的检查约束。

CHECK OPTION选项表示视图启动了和子查询条件一样的约束。也就是说,如果对视图修改或插入的数据和查询条件不一致,那么该操作会被中止。

【示例10】创建带检查约束的视图

具体操作脚本如下:


01 CREATE OR REPLACE VIEW SIMPLE_PRODUCTINFO_VIEW AS

02 SELECT PRODUCTID,PRODUCTNAME,PRODUCTPRICE,CATEGORY,ORIGIN

03 FROM PRODUCTINFO

04 WHERE ORIGIN='中国'

05 WITH CHECK OPTION


【代码解析】

❑第5行的选项就开启了条件检查。这时如果要增加或修改数据,就要符合WHERE后面的条件,即ORIGIN字段的值是“中国”。

【执行效果】

以上脚本创建视图的数据要求只列出产地是中国的商品。查询后的列表如图9.13所示。

9.3.2 视图CHECK OPTION设置 - 图1

图 9.13 数据列表

为了验证视图的CHECK OPTION设置是否生效,下面在PL/SQL Developer工具中对视图进行DML操作。

(1)增加数据

执行如下增加语句:


INSERT INTO SIMPLE_PRODUCTINFO_VIEW

(PRODUCTID,PRODUCTNAME,PRODUCTPRICE,CATEGORY,ORIGIN)

VALUES('0240050005','测试',400.00,'0100040001','美国')


这里增加的数据ORIGIN字段值是“美国”,它和视图的查询条件不一致,出现错误提示,如图9.14所示。

9.3.2 视图CHECK OPTION设置 - 图2

图 9.14 错误提示

(2)修改数据

对视图某条记录进行修改。执行如下语句:


UPDATE SIMPLE_PRODUCTINFO_VIEW

SET ORIGIN='美国'

WHERE PRODUCTID='0240020001'


以上脚本把视图里已有数据的ORIGIN字段值修改为“美国”,但依然提示图9.14所示错误。

(3)删除数据

在表PRODUCTINFO中有一条数据的ORIGIN字段的值是“美国”,接下来对视图执行删除操作。脚本如下:


DELETE FROM SIMPLE_PRODUCTINFO_VIEW

WHERE ORIGIN='美国'


脚本执行后并没有出现错误提示,但提示0行被操作。这不但说明了视图过滤出来的数据和源表的数据在逻辑上彻底分离,也说明了CHECK OPTION项对删除没有作用(如果有作用,删除语句将无法执行)。