说明:
本文通过定义一个基本表,分析了在两种视图的情况下,使用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是多余的。