`
王树雄
  • 浏览: 239623 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

浅析 with check option

阅读更多

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

 

先自定义一个table   名为 :Star

 

 

 

 

 

 

 

 

 

 

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

create view  IS_Star
as

select  *from Star
where  name  like '张%' 

with check option  

 

获取张姓明星情况:

 

select * from IS_Star

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

 

 比如

update IS_Star  set name='刘家辉'  where name='张家辉

 这是不可以的。

 而

update IS_test set name='张家界'  where name='张家辉'

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

 

 

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

 

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

create  view IS_Star1 
as
select * from Star where age>40
with check option 

update  IS_Star1 set age=age-6 where name='张家辉'

 

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

 

  而如果是

update  IS_Star1 set age=age-4 where name='张家辉'

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

 

 

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

/*create  view IS_Star2
as  select * from Star  
where age >40 


select * from IS_Star2

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是多余的

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics