关于With Check Option(转载)

来源:互联网 发布:网络监控 距离 编辑:程序博客网 时间:2024/06/07 01:24

WITH CHECK OPTION specifies that,if the subquery is used inplace of a table in an INSERT,UPDATE,or DELETE statement,oraclewill not allow any changes to that table that would produce rowsthat are not included in the subquery.

create or replace view testview
as
select empno,ename from emp where ename like ‘M%’
with check option;

这里我们创建了一个视图,并使用了with check option来限制了视图。 然后我们来看一下视图包含的结果:
select * from testview得到:
EMPNO ENAME
———- ———–
7654 MARTIN
7934 MILLER
这两条记录

然后我们在试图将其中一条更新:
update testview
set ename = ‘Mike’
where empno = 7654;
OK,这条更新语句可以执行,并没有什么问题,但是当我们执行另一条更新时:
update testview
set ename = ‘Robin’
where empno = ‘7654′;
就会出现ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句的错误,这是因为什么呢?

这是因为前面我们在创建视图时指定了witch checkoption关键字,这也就是说,更新后的每一条数据仍然要满足创建视图时指定的where条件,所以我们这里发生了错误ORA-01402。

但是需要说明的时 ,虽然指定了with checkoption,我们还是可以删除视图中的数据。例如上例中,我们可以使用
delete from test where where empno=   7654


--------------------------------------------------------------------------------

我创建一个视图:  
  create  view  IS_student  
  as  
  select  sno,sname,sage  
  from  student  
  where  sdept='IS'  
  with  check  option;  
  加上了with  check  option;后,不能执行插入操作:  
   
  insert  into  is_student  
 values('95100','李娜',12)  
   
  什么原因?不加上with  check  option则可以!  
 
with  check  option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。  
   
 --->而你只是查询出sdept='is'的纪录,你插入的根本不符合sdept='is'呀,所以就不行
 
默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,可创建一个查询,从而定义一个视图以在表中检索所有员工薪水低于  $30,000  的行。如果该员工的薪水涨到了  $32,000,则查询视图时该特定员工将不再出现,因其薪水不符合视图所设的标准。但是,WITH  CHECK  OPTION  子句强制所有数据修改语句均根据视图执行,以符合定义视图的  SELECT  语句中所设的条件。如果使用该子句,修改行时需考虑到不让它在修改完后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误信息。

0 0
原创粉丝点击