关于sql的with check option的问题

visly 2009-10-29 02:31:59
student表:
95001 李勇 男 20 CS
95002 刘晨 女 21 IS
95003 王敏 女 18 MA
95004 张力 男 19 IS


建立视图IS_STUDENT显示“IS”系所有学生的学号、姓名、性别。
create view IS_STUDENT
as
select Sno,Sname,Ssex
from Student
where Sdept='IS'
with check option;

用insert语句向视图中插入元组('95009','王五','男'),查看基本表student表中插入的数据值。



问题::当没有加上with check option 的时候,可以成功插入,切插入到基本表的年龄和专业都是null。
当加上with check ooption 的时候,就插入失败了,这是怎么回事?麻烦详解一下

下面是失败的消息:
消息 550,级别 16,状态 1,第 1 行
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
语句已终止
...全文
1513 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
visly 2009-10-29
  • 打赏
  • 举报
回复
我明白了 ,,谢谢大家了,新手分不多,给大家都散些
忆轩辕 2009-10-29
  • 打赏
  • 举报
回复
如果student那个Sdept没有默认值IS是不可能插进去的
visly 2009-10-29
  • 打赏
  • 举报
回复
1 建立视图IS_STUDENT显示“IS”系所有学生的学号、姓名、性别。视图的定义加入WITH CHECK OPTION子句
用insert语句向视图中插入元组('95009','王五','男'),查看基本表student表中插入的数据值。


这个是原来的问题
忆轩辕 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 visly 的回复:]
引用 10 楼 fredrickhu 的回复:
对于insert,有with check option,要保证insert后,数据要被视图查询出来

只要插入以后的数据能被查询出来就行了

插入'95009','王五','男','is'试下


还是不行的,但是我把Student的Sdept的默认值改成了IS后直接这样写就插进去了
insert
into IS_STUDENT1
values('95009','王五','男')


总之还是迷迷糊糊的啊~~~~(>_ <)~~~~


[/Quote]

插入后的数据,通过视图能够查询出来就符合WITH CHECK OPTION
否则就不符合
SQL77 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 visly 的回复:]
引用 10 楼 fredrickhu 的回复:
对于insert,有with check option,要保证insert后,数据要被视图查询出来

只要插入以后的数据能被查询出来就行了

插入'95009','王五','男','is'试下


还是不行的,但是我把Student的Sdept的默认值改成了IS后直接这样写就插进去了
insert
into IS_STUDENT1
values('95009','王五','男')


总之还是迷迷糊糊的啊~~~~(>_ <)~~~~


[/Quote]
你查询的是IS的,你插入个不是IS的进去?
--小F-- 2009-10-29
  • 打赏
  • 举报
回复
看看13楼那个就知道了
visly 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fredrickhu 的回复:]
对于insert,有with check option,要保证insert后,数据要被视图查询出来

只要插入以后的数据能被查询出来就行了

插入'95009','王五','男','is'试下
[/Quote]

还是不行的,但是我把Student的Sdept的默认值改成了IS后直接这样写就插进去了
insert
into IS_STUDENT1
values('95009','王五','男')


总之还是迷迷糊糊的啊~~~~(>_<)~~~~

--小F-- 2009-10-29
  • 打赏
  • 举报
回复
通过有with check option选项的视图操作基表(只是面对单表,对连接多表的视图正在寻找答案),有以下结论:
首先视图只操作它可以查询出来的数据,对于它查询不出的数据,即使基表有,也不可以通过视图来操作。
1.对于update,有with check option,要保证update后,数据要被视图查询出来
2.对于delete,有无with check option都一样
4.对于insert,有with check option,要保证insert后,数据要被视图查询出来
对于没有where 子句的视图,使用with check option是多余的
SQL77 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 visly 的回复:]
引用 8 楼 fredrickhu 的回复:
你插入的插入元组('95009','王五','男')不在你视图查询的范围之内



那我要怎么才能插入啊?
[/Quote]
你把所有的列都插入一个值,应该可以了
--小F-- 2009-10-29
  • 打赏
  • 举报
回复
对于insert,有with check option,要保证insert后,数据要被视图查询出来

只要插入以后的数据能被查询出来就行了

插入'95009','王五','男','is'试下
visly 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fredrickhu 的回复:]
你插入的插入元组('95009','王五','男')不在你视图查询的范围之内
[/Quote]


那我要怎么才能插入啊?
--小F-- 2009-10-29
  • 打赏
  • 举报
回复
你插入的插入元组('95009','王五','男')不在你视图查询的范围之内
--小F-- 2009-10-29
  • 打赏
  • 举报
回复
其实是一个作用范围的问题
visly 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。

--->而你只是查询出sdept='is'的纪录,你插入的根本不符合sdept='is'呀,所以就不行默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,可创建一个查询,从而定义一个视图以在表中检索所有员工薪水低于 $30,000 的行。如果该员工的薪水涨到了 $32,000,则查询视图时该特定员工将不再出现,因其薪水不符合视图所设的标准。但是,WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件。如果使用该子句,修改行时需考虑到不让它在修改完后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误信息。
[/Quote]

这个我看过了‘CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件。’这是什么意思,还有就是我的视图里面都是IS的学生 ,插入的时候要怎么办,要说明也是IS的学生吗?
Zoezs 2009-10-29
  • 打赏
  • 举报
回复
没这么干过。学习。
忆轩辕 2009-10-29
  • 打赏
  • 举报
回复
主要是这个条件

where Sdept='IS'
visly 2009-10-29
  • 打赏
  • 举报
回复
那加上with check option 的时候怎么向视图里面出入数据?
--小F-- 2009-10-29
  • 打赏
  • 举报
回复
with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。

--->而你只是查询出sdept='is'的纪录,你插入的根本不符合sdept='is'呀,所以就不行默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,可创建一个查询,从而定义一个视图以在表中检索所有员工薪水低于 $30,000 的行。如果该员工的薪水涨到了 $32,000,则查询视图时该特定员工将不再出现,因其薪水不符合视图所设的标准。但是,WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件。如果使用该子句,修改行时需考虑到不让它在修改完后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误信息。
SQL77 2009-10-29
  • 打赏
  • 举报
回复
WITH CHECK OPTION

强制视图上执行的所有数据修改语句都必须符合由 select_statement 设置的准则。通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到修改的数据。
第一篇 Oracle管理配置 第1章 Oracle安装配置(教学视频:10分钟) 23 1.1 Oracle简介 23 1.1.1 数据库术语 23 1.1.2 主流数据库简介 24 1.1.3 Oracle数据库的特点 24 1.2 安装Oracle数据库 25 1.2.1 Oracle数据库的版本变迁及安装环境 25 1.2.2 安装过程 26 1.2.3 安装中需要注意的问题 27 1.3 本章小结 28 1.4 习题 28 第2章 Oracle常用工具(教学视频:7分钟) 29 2.1 Net Configuration Assistant(网络配置助手) 29 2.1.1 监听程序配置 29 2.1.2 命名方法配置 31 2.1.3 本地Net服务名配置 32 2.2 Net Manager(网络管理员) 34 2.3 本章实例 36 2.4 本章小结 38 2.5 习题 38 第3章 SQL Plus和PL/SQL(教学视频:11分钟) 39 3.1 SQL Plus与PL/SQL简介 39 3.2 使用SQL Plus 40 3.2.1 登录SQL Plus 40 3.2.2 SQL Plus输出结果的格式化 41 3.2.3 SQL Plus小结 46 3.3 PL/SQL 46 3.3.1 PL/SQL常用开发工具 46 3.3.2 开发一个简单的PL/SQL程序 48 3.4 本章实例 49 3.5 本章小结 50 3.6 习题 50 第二篇 Oracle数据库对象 第4章 Oralce数据库(教学视频:15分钟) 51 4.1 创建Oracle数据库 51 4.2 Oracle数据库的相关术语 52 4.2.1 数据库 53 4.2.2 数据库实例和SID 53 4.2.3 ORACLE_SID 54 4.3 Oracle数据库的备份与恢复 55 4.3.1 逻辑备份/恢复(导出/导入) 55 4.3.2 物理备份/恢复 56 4.3.3 利用PL/SQL Developer备份数据库 60 4.4 本章实例 61 4.5 本章小结 61 4.6 习题 62 第5章 Oracle数据表对象(教学视频:42分钟) 63 5.1 Oracle表空间 63 5.1.1 Oracle表空间简介 63 5.1.2 创建Oracle表空间 64 5.1.3 查看表空间 66 5.1.4 修改数据库默认表空间 67 5.1.5 修改表空间名称 68 5.1.6 删除表空间 69 5.2 创建Oracle数据表 70 5.2.1 利用工具创建数据表 70 5.2.2 利用工具查看数据表 71 5.2.3 利用命令创建数据表 72 5.2.4 利用命令查看表结构 72 5.3 修改Oracle数据表结构 73 5.3.1 利用工具修改数据表结构 73 5.3.2 利用命令修改数据表结构 74 5.4 删除数据表 75 5.4.1 利用工具删除数据表 76 5.4.2 利用SQL语句删除数据表 76 5.5 备份/恢复数据表 76 5.5.1 利用工具备份/恢复数据表 77 5.5.2 利用命令备份/恢复数据表 82 5.6 临时表 83 5.6.1 临时表简介 83 5.6.2 会话级临时表 84 5.6.3 事务级临时表 85 5.6.4 查看临时表在数据库中的信息 86 5.6.5 临时表的应用场景 86 5.7 特殊的表dual 87 5.7.1 分析dual表 87 5.7.2 dual表的应用场景 87 5.7.3 修改dual表对查询结果的影响 88 5.8 本章实例 89 5.9 本章小结 90 5.10 习题 90 第6章 约束(教学视频:43分钟) 91 6.1 主键约束 91 6.1.1 主键简介 91 6.1.2 创建主键约束 92 6.1.3 修改表的主键约束 94 6.1.4 主键应用场景 96 6.2 外键约束 97 6.2.1 外键简介 97 6.2.2 创建外键约束 97 6.2.3 级联更新与级联删除 100 6.2.4 修改外键属性 102 6.2.5 外键使用 104 6.3 唯一性约束 105 6.3.1 唯一性约束简介 105 6.3.2 创建唯一性约束 105 6.3.3 修改唯一性约束 107 6.3.4 唯一性约束的使用 108 6.4 检查约束 108 6.4.1 检查约束简介 108 6.4.2 创建检查约束 108 6.4.3 修改检查约束 110 6.4.4 检查约束的使用 111 6.5 默认值约束 111 6.5.1 默认值约束简介 112 6.5.2 创建默认值约束 112 6.5.3 修改默认值约束 113 6.6 本章实例 115 6.7 本章小结 116 6.8 习题 116 第7章 视图(教学视频:50分钟) 117 7.1 关系视图 117 7.1.1 建立关系视图 117 7.1.2 修改/删除视图 118 7.1.3 联接视图 120 7.1.4 编译视图 122 7.1.5 使用force选项强制创建视图 124 7.1.6 利用视图更新数据表 125 7.1.7 with check option选项 126 7.1.8 关系视图小结 128 7.2 内嵌视图 128 7.2.1 内嵌视图简介 128 7.2.2 内嵌视图的使用 128 7.2.3 内嵌视图小结 130 7.3 对象视图 131 7.3.1 对象视图简介 131 7.3.2 对象视图简介 131 7.4 物化视图 133 7.4.1 物化视图简介 133 7.4.2 物化视图的使用 133 7.4.3 物化视图的数据加载 135 7.4.4 物化视图的数据更新 135 7.4.5 查询重写 136 7.5 本章小结 136 7.6 本章实例 137 7.7 习题 137 第8章 函数与存储过程(教学视频:48分钟) 138 8.1 函数 138 8.1.1 函数简介 138 8.1.2 创建函数 139 8.1.3 函数中的括号 140 8.1.4 函数的参数 141 8.1.5 函数的确定性 142 8.1.6 典型函数举例 143 8.2 存储过程 144 8.2.1 存储过程简介 144 8.2.2 创建存储过程 144 8.2.3 存储过程的参数——IN参数 146 8.2.4 存储过程的参数——OUT参数 147 8.2.5 存储过程的参数——IN OUT参数 149 8.2.6 存储过程的参数——参数顺序 149 8.2.7 存储过程的参数——参数的默认值 152 8.2.8 存储过程的参数——参数顺序总结 153 8.3 程序包 153 8.3.1 规范 153 8.3.2 主体 155 8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 161 …… 第9章 游标(教学视频:36分钟) 162 第10章 触发器(教学视频:58分钟) 178 第11章 序列(教学视频:28分钟) 206 第12章 用户角色与权限控制(教学视频:45分钟) 215 第三篇 Oracle中的SQL 第13章 Oracle数据类型(教学视频:21分钟) 231 第14章 Oracle中的函数与表达式(教学视频:111分钟) 240 第15章 Oracle中的控制语句(教学视频:16分钟) 282 第16章 SQL查询(教学视频:55分钟) 290 第17章 SQL更新数据(教学视频:34分钟) 319 第四篇 Oracle编程高级应用 第18章 数据库速度优化与数据完整性(教学视频:32分钟) 332 第19章 数据一致性与事务管理(教学视频:46分钟) 341 第20章 并发控制(教学视频:35分钟) 356 第21章 Oracle中的正则表达式(教学视频:29分钟) 369 第五篇 Oracle与编程语言综合使用实例 第22章 Oracle在Java开发中的应用(教学视频:38分钟) 376 第23章 Oracle在C#开发中的应用(教学视频:12分钟) 391

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧