ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 37797|回复: 8

[每日一题] PL/SQL Challenge 每日一题:2017-3-2 视图的WITH CHECK OPTION

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-3-7 05:58 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者:Kim Berg Hansen

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

我有一张表保存着人们生活于哪个国家:

create table qz_people (
   name    varchar2(20) not null
, country varchar2(2)  not null
)
/

每个选项有一个INSERT语句,有些前面还带有DDL。

哪些选项能够成功执行DDL(如果有的话)以及成功往表里插入一行,使得选项执行之后,测试查询会显示表里有一行:

select count(*)
  from qz_people
/

  COUNT(*)
----------
         1

(A)
insert into (
   select name, country
     from qz_people
    where country = 'DK'
     WITH CHECK OPTION
)
values ('Steven', 'US')
/

(B)
insert into (
   select name, country
     from qz_people
    where country = 'DK'
     WITH CHECK OPTION
)
values ('Kim', 'DK')
/

(C)
insert into (
   select name, country
     from qz_people
    where country = 'DK'
)
values ('Steven', 'US')
/


(D)
create or replace view qz_danish_people
as
select name, country
  from qz_people
where country = 'DK'
/

insert into qz_danish_people
values ('Steven', 'US')
/

(E)
create or replace view qz_danish_people
as
select name, country
  from qz_people
where country = 'DK'
  WITH CHECK OPTION
/

insert into qz_danish_people
values ('Steven', 'US')
/

(F)
create or replace view qz_danish_people
as
select name, country
  from qz_people
where country = 'DK'
  WITH CHECK OPTION
/

insert into qz_danish_people
values ('Kim', 'DK')
/

(G)
create or replace view qz_danish_people
as
select name, country
  from qz_people
where country = 'DK'
/

insert into qz_danish_people
  WITH CHECK OPTION
values ('Steven', 'US')
/

(H)
create or replace view qz_danish_people (
   name
, country
, CONSTRAINT qz_people_are_danish CHECK (country = 'DK')
)
as
select name, country
  from qz_people
where country = 'DK'
/

insert into qz_danish_people
values ('Kim', 'DK')
/

认证徽章
论坛徽章:
1
秀才
日期:2017-04-05 13:18:06
发表于 2017-3-7 09:02 | 显示全部楼层
答案是:BCDG

使用道具 举报

回复
论坛徽章:
18
秀才
日期:2016-04-29 15:11:10秀才
日期:2017-04-05 13:27:59秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2017-01-20 11:06:21秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31
发表于 2017-3-7 10:06 | 显示全部楼层
我选BCFH
其他不符合内迁视图的约束条件

使用道具 举报

回复
论坛徽章:
18
秀才
日期:2016-04-29 15:11:10秀才
日期:2017-04-05 13:27:59秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2017-01-20 11:06:21秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31
发表于 2017-3-7 10:24 | 显示全部楼层
我选BCF
修正一下,H没有这样语法
其他不符合内迁视图的约束条件

使用道具 举报

回复
论坛徽章:
15
秀才
日期:2017-01-20 11:04:31秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2016-11-09 14:32:17秀才
日期:2016-11-09 14:32:49秀才
日期:2016-11-09 14:32:49秀才
日期:2016-11-09 14:32:49秀才
日期:2016-11-09 14:32:49技术图书徽章
日期:2016-11-09 14:33:08秀才
日期:2016-11-09 14:46:36
发表于 2017-3-7 10:49 | 显示全部楼层
我选BCDF.
其中A,E插入的数据不满足CHECK OPTION
G中insert语句不应该使用WITH CHECK OPTION语句
H中check语句语法错误

使用道具 举报

回复
认证徽章
论坛徽章:
3
蒙奇·D·路飞
日期:2016-06-30 14:41:43秀才
日期:2017-04-05 13:18:06秀才
日期:2017-04-05 13:22:59
发表于 2017-3-7 12:00 | 显示全部楼层
答案: BCDF.   同意楼上..

使用道具 举报

回复
认证徽章
论坛徽章:
6
林肯
日期:2013-07-30 18:00:55优秀写手
日期:2014-10-23 06:00:14马上有对象
日期:2015-01-16 13:26:19懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18秀才
日期:2015-12-14 15:09:38
发表于 2017-3-7 14:30 | 显示全部楼层
每次都能学习点东西。不错

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-3-7 16:50 | 显示全部楼层
bcdf吧

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
 楼主| 发表于 2017-3-8 05:13 | 显示全部楼层
答案BCDF, 5楼得奖。

A: 因为子查询带有WITH CHECK OPTION, 这意味着你不能向子查询插入不满足WHERE过滤子句的数据行,而Steven住在每个(USA)而非丹麦(Denmark)。这会报错:
ORA-01402: view WITH CHECK OPTION where-clause violation.
B: 但是Kim住在丹麦,所以他满足了WHERE子句,因此可以通过子查询插入到表中。
C: 在没有WITH CHECK OPTION的情况下,可以向表中插入一个不满足WHERE子句的数据因而不会被子查询选中,这是完全没问题的。
D: 不管是前述选项中的子查询,还是本选项中的视图,结果都是一样。在这里Steven可以通过视图插入,即使当你从视图SELECT的时候,这个视图不会显示他的数据。
E: 视图也可以如果A选项那样带有WITH CHECK OPTION,因此限制了插入的数据同样会被视图选中。如同A选项,这会报错:
ORA-01402: view WITH CHECK OPTION where-clause violation.
F: 如果B选项,带with check option的视图能选中的数据也可以通过视图插入到表中。
G: WITH CHECK OPTION 子句属于子查询里面的定义,要么像选项A和B或者像前两个选项的视图。它不能用于INSERT子句,所以这会报错:
ORA-00903: invalid table name.
H: 视图可以带某些种类的约束(主键和外键),它们不会被强制,仅仅是为了元数据的需要。但是视图中是不能带CHECK选项的,CREATE VIEW语句会报错:
ORA-00904: : invalid identifier.
既然视图无法被创建,INSERT就会报错:
ORA-00942: table or view does not exist.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表