Mysql 视图笔记2

这学期开了数据库的课,对sql注入颇感兴趣。因此,对数据库语句也颇为喜爱。遇到了with check option 问题。这属于sql view里面的一个问题。在此略做小结。大牛勿喷!

先自定义一个table   名为 :Star

先定义视图找出所有张姓明星:

Java代码
  1. create view  IS_Star  
Java代码 
  1. as  
  2.   
  3. select  *from Star  
Java代码
  1. where  name  like '张%'   
  2.   
  3. with check option    

 获取张姓明星情况:

Java代码 
  1. select * from IS_Star  

 此时,with  check option 约束条件是对视图里面所有的name 首字符必须是以 ‘张’字打头。不管是修改前还是修改后都必须总从此规则。否则出错。

 比如

Java代码 
  1. update IS_Star  set name='刘家辉'  where name='张家辉  

 这是不可以的。

 而

Java代码  收藏代码
  1. update IS_test set name='张家界'  where name='张家辉'  

 是可以。前后姓没有变。满足where 后面的约束条件。

而如果在选取视图的时候没有使用 with check option 约束语句的话,那么。是可以改得。也就是张家辉既可以变成刘家辉也可以变成张家界

 另外如果选取年龄大于四十的明星

Java代码  收藏代码
  1. create  view IS_Star1   
Java代码 
  1. as  
Java代码
  1. select * from Star where age>40  
Java代码 
  1. with check option   
Java代码 
  1.   
Java代码 
  1. update  IS_Star1 set age=age-6 where name='张家辉'  

   这样会报错 服务器: 消息 550,级别 16,状态 1,行 1
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束的条件。
语句已终止。

  而如果是

Java代码 
  1. update  IS_Star1 set age=age-4 where name='张家辉'  

  那么则正确插入。这里的意思是在视图里面的所有信息,只要在创建视图的时候加了with check option  那么。则不允许它的那个属性值变为不属于 where 后面条件的情况 

 如果不加with check option 那么则值可以任意变。

Java代码 
  1. /*create  view IS_Star2 
  2. as  select * from Star   
  3. where age >40  
  4.  
  5.  
  6. select * from IS_Star2 
  7.  
  8. update IS_Star set age =age-10 where name='张家辉'*/  

  小结:

1.对于update,有with check option,要保证update后,数据要被视图查询出来
2.对于delete,有无with check option都一样
4.对于insert,有with check option,要保证insert后,数据要被视图查询出来
5.对于没有where 子句的视图,使用with check option是多余的

原文地址:https://www.cnblogs.com/bohanfu/p/5737480.html