代码改变世界

with check option(数据库)

2012-12-06 09:00  我是流氓兔~~  阅读(801)  评论(0编辑  收藏  举报

with check option 通过有通过有通过有通过有with check option选项的视图操作基表选项的视图操作基表选项的视图操作基表选项的视图操作基表(只是面对单表只是面对单表只是面对单表只是面对单表,,,,对连接多对连接多对连接多对连接多表的视图正在寻找答案表的视图正在寻找答案表的视图正在寻找答案表的视图正在寻找答案),,,,有以下结论有以下结论有以下结论有以下结论:::: 首先视图只操作它可以查询出来的数据首先视图只操作它可以查询出来的数据首先视图只操作它可以查询出来的数据首先视图只操作它可以查询出来的数据,,,,对于它查询不出的数据对于它查询不出的数据对于它查询不出的数据对于它查询不出的数据,,,,即使基表有即使基表有即使基表有即使基表有,,,,也不可以通过视图来操作也不可以通过视图来操作也不可以通过视图来操作也不可以通过视图来操作。。。。 1.对于对于对于对于update,有有有有with check option,,,,要保证要保证要保证要保证update后后后后,,,,数据要被视数据要被视数据要被视数据要被视图查询图查询图查询图查询出来出来出来出来 2.对于对于对于对于delete,有无有无有无有无with check option都一样都一样都一样都一样 3.对于对于对于对于insert,有有有有with check option,,,,要保证要保证要保证要保证insert后后后后,,,,数据要被视图查数据要被视图查数据要被视图查数据要被视图查询出来询出来询出来询出来 对于没有对于没有对于没有对于没有where 子句的视图子句的视图子句的视图子句的视图,,,,使用使用使用使用with check option是多余的是多余的是多余的是多余的。。。。 我们来看下面的例子我们来看下面的例子我们来看下面的例子我们来看下面的例子:::: create  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 check option关键字关键字关键字关键字,,,,这也这也这也这也就是说就是说就是说就是说,,,,更新后的每一条数据仍然要满足创建视图时指定的更新后的每一条数据仍然要满足创建视图时指定的更新后的每一条数据仍然要满足创建视图时指定的更新后的每一条数据仍然要满足创建视图时指定的where条件条件条件条件,,,,所所所所以我们这里发生了错误以我们这里发生了错误以我们这里发生了错误以我们这里发生了错误ORA-01402。。。。 但是需要说明的时但是需要说明的时但是需要说明的时但是需要说明的时 ,,,,虽然指定了虽然指定了虽然指定了虽然指定了with check option,,,,我们还是可以删除视我们还是可以删除视我们还是可以删除视我们还是可以删除视图中的数据图中的数据图中的数据图中的数据。。。。例如上例中例如上例中例如上例中例如上例中,,,,我们可以使用我们可以使用我们可以使用我们可以使用 delete from test  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   语句中所设的条件语句中所设的条件语句中所设的条件语句中所设的条件。。。。如果如果如果如果使用该子句使用该子句使用该子句使用该子句,,,,修改行时需考虑到不让它在修改完后从视图中消失修改行时需考虑到不让它在修改完后从视图中消失修改行时需考虑到不让它在修改完后从视图中消失修改行时需考虑到不让它在修改完后从视图中消失。。。。任何可能导任何可能导任何可能导任何可能导致行消失的修改都会被取消致行消失的修改都会被取消致行消失的修改都会被取消致行消失的修改都会被取消,,,,并显示错误信息并显示错误信息并显示错误信息并显示错误信息