【数据库】浅谈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
  1. 把“注册会计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 约束。
语句已终止。
在这里插入图片描述

  1. 如果把“注册会计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
  1. 把“CP0801”的grade变成2006
UPDATE IS_Class1
SET grade=grade-2
WHERE classNo='CP0801'

结果会出现报错

消息 550,级别 16,状态 1,第 54 行
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
语句已终止。
在这里插入图片描述

  1. 如果把“CP0801”的grade变成2007
UPDATE IS_Class1
SET grade=grade-1
WHERE classNo='CP0801'

结果修改成功
在这里插入图片描述
那么,我们再对这张IS_Class1 视图进行修改。

  1. 把“CP0801”的班级改为"注册会计08_02班"
UPDATE IS_Class1 
SET className='注册会计08_02班'
WHERE classNo='CP0801'

结果修改成功
在这里插入图片描述

  1. 再把“注册会计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是多余的。

发布了94 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_46218781/article/details/105332073
今日推荐