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.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.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项对删除没有作用(如果有作用,删除语句将无法执行)。