【数据库】浅谈WITH CHECK OPTION的作用 您所在的位置:网站首页 sql中check的用法 【数据库】浅谈WITH CHECK OPTION的作用

【数据库】浅谈WITH CHECK OPTION的作用

2024-03-03 09:12| 来源: 网络整理| 查看: 265

摘要:微信搜索【三桥君】 说明: 本文通过定义一个基本表,分析了在两种视图的情况下,使用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 实验室设备网 版权所有