【数据库】浅谈WITH CHECK OPTION的作用 | 您所在的位置:网站首页 › sql中check的用法 › 【数据库】浅谈WITH CHECK OPTION的作用 |
摘要:微信搜索【三桥君】 说明: 本文通过定义一个基本表,分析了在两种视图的情况下,使用WITH CHECK OPTION对SQL语句查询视图的影响,对比分析说明了WITH CHECK OPTION的作用。 如果同学们感兴趣,可以自行把代码复制到软件上测试运行。 本文测试使用的软件为SQL Server2014版。 一、定义基本表首先,定义一张Class表 //创建数据库WCO CREATE DATABASE WCO //使用数据库WCO USE WCO //创建Class表 CREATE TABLE Class( classNo CHAR(6) NOT NULL, className VARCHAR(30) NOT NULL, institute VARCHAR(30), grade SMALLINT, classNum TINYINT ) //添加数据到Class表 INSERT INTO Class VALUES('CP0801','注册会计08_01班','会计学院',2008,NULL), ('CP0802','注册会计08_02班','会计学院',2008,NULL), ('CP0701','计算机科学与技术07_01班','信息管理学院',2007,NULL), ('CP0702','计算机科学与技术07_01班','信息管理学院',2007,NULL), ('ER0601','金融管理06_01班','金融学院',2006,NULL), ('ER0602','金融管理06_02班','金融学院',2006,NULL), ('IS0501','信息管理与信息系统05_01班','信息管理学院',2005,NULL), ('IS0502','信息管理与信息系统05_02班','信息管理学院',2005,NULL) 二、情况分析 (一)定义视图虚表1先定义 IS_Class 视图找出带有“注册会计”的班级名,使用 WITH CHECK OPTION CREATE VIEW IS_Class AS SELECT * FROM Class WHERE className LIKE '注册会计%' WITH CHECK OPTION 把“注册会计08_01班”改为“会计08_01班” //把注册会计08_01班改为会计08_01班 UPDATE IS_Class SET className='会计08_01班' WHERE className='注册会计08_01班'结果会出现报错 消息 550,级别 16,状态 1,第 37 行 试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。 语句已终止。 如果把“注册会计08_01班”改为“注册会计08_02班” UPDATE IS_Class SET className='注册会计08_02班' WHERE className='注册会计08_01班'结果成功修改 (二)定义视图虚表2定义 IS_Class1 视图找出带有“grade>=2007”的班级名,使用 WITH CHECK OPTION CREATE VIEW IS_Class1 AS SELECT * FROM Class WHERE grade>=2007 WITH CHECK OPTION 把“CP0801”的grade变成2006 UPDATE IS_Class1 SET grade=grade-2 WHERE classNo='CP0801'结果会出现报错 消息 550,级别 16,状态 1,第 54 行 试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。 语句已终止。 如果把“CP0801”的grade变成2007 UPDATE IS_Class1 SET grade=grade-1 WHERE classNo='CP0801'结果修改成功 那么,我们再对这张IS_Class1 视图进行修改。 把“CP0801”的班级改为"注册会计08_02班" UPDATE IS_Class1 SET className='注册会计08_02班' WHERE classNo='CP0801'结果修改成功 再把“注册会计08_02班”改为“会计08_01班” UPDATE IS_Class1 SET className='会计08_01班' WHERE className='注册会计08_02班'结果修改成功 三、综上所述,我们可以得出结论:在视图有WITH CHECK OPTION 的情况下: 对视图进行UPDATE修改时, 修改的数据会受到原来定义视图时WHERE的条件的影响。 像第一种情况,WHERE的条件是className的首字符是含有“注册会计”的。 那么,视图进行UPDATE修改时,不能把这个条件给改没了。 同理,第二种情况的grade>=2007的条件也不能改没了。 所以,只要符合上述定义时条件的要求,视图其他方面的修改是可以正常运行的。 在视图没有WITH CHECK OPTION 的情况下: 视图修改会是怎样的呢? 答案是可以任意修改正常运行。 四、总结:WITH CHECK OPTION的作用? 1.对于update,有with check option,要保证update后,数据要被视图查询出来; 2.对于delete,有无with check option都一样; 4.对于insert,有with check option,要保证insert后,数据要被视图查询出来; 5.对于没有where 子句的视图,使用with check option是多余的。 文章整理不易,如有帮助请点赞关注支持,谢谢!微信搜索【三桥君】,回复【关注】有我准备的一份资源大礼包。后续持续更新~~~ |
CopyRight 2018-2019 实验室设备网 版权所有 |