热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

oracle创建视图用withcheckoption子句详解

小结:如果创建的视图中带有where等条件,则withcheckoption子句可以保证让你只能在视图的条件之内对视图进行DML。当创建的视图中带有withcheckoption子句时,只要DML的结果满足该创建的视图中的where子句条件,DML就可以正常进行。

小结: 如果 创建 的视图中带有where等条件,则 with check option 子句可以保证让你只能在视图的条件之内对视图进行DML。 当 创建 的视图中带有 with check option 子句 时,只 要 DML的结果 满足 该 创建 的视图中 的where子句条件 ,DML就可以正常进行。

小结:

如果创建的视图中带有where等条件,则with check option 子句可以保证让你只能在视图的条件之内对视图进行DML。

创建的视图中带有with check option 子句时,只DML的结果满足创建的视图中的where子句条件,DML就可以正常进行。

如果subquery中的SELECT子句上没有where条件里所有出现的列,则DML类型的主查询语句也不会执行成功的。(?)

如果不加WITH CHECK OPTION则在插入时不会检查where条件。即如果你在创建视图时,使用where 子句限制时没有使用到 with check option 子句 时,当你在通过视图插入数据时,oracle 就不会检查 where 子句的限制条件。


疑问:创建视图的语句里可以有group by子句【group by子句可以附带having子句的】(或是orderby)存在吗?不可group by子句吧


with check option 子句用于普通视图内联视图(in-line view)中。


关于普通视图内联视图的关系,可以参见:

内联视图和普通视图的关系以及和子查询的区别


WITH CHECK OPTION

The WITH CHECK OPTION clause specifies the level of checking to be done when doingDML against the view. If specified, every row that is inserted, updated or deleted through the view must conform to the definition of the view.

The problem:

SQL> CREATE VIEW d20 AS SELECT ename, sal, deptno FROM emp2 WHERE deptno = 20;
View created.
SQL> UPDATE d20 SET deptno = 10;
3 rows updated.

The solution:

SQL> CREATE VIEW d20 AS SELECT ename, sal, deptno FROM emp2 WHERE deptno = 20
  2  WITH CHECK OPTION;
View created.
SQL> UPDATE d20 SET deptno = 10;
UPDATE d20 SET deptno = 10
       *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation


with check option 子句应用于普通视图中的例子,详见下文:


如果创建的视图中带有where等条件,则with check option 子句可以保证让你只能在视图的条件之内对视图进行DML。
例如,我创建如下视图:
gyj@OCM> create or replace view v_t3 as select id, name,salary from t3 where salary>=7000 with check option;


View created.

视图中的条件是salary>=7000,因此,我插入一个要salary小于7000的行,将会报出错误:


gyj@OCM> insert into v_t3 values(5,'gyj5',1000);
insert into v_t3 values(5,'gyj5',1000)
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation



而插入一个大于7000的行,可以成功插入:


gyj@OCM> insert into v_t3 values(5,'gyj5',7500);


1 row created.

如果subquery中的SELECT子句上没有where条件里所有出现的列,则DML类型的主查询语句也不会执行成功的。例如,

  1. SQL> INSERT INTO (SELECT order_id,order_date,customer_id FROM ORDERS
  2. 2 WHERE order_total=1000
  3. 3 WITH CHECK OPTION) VALUES(13,SYSDATE,101);
  4. INSERT INTO (SELECT order_id,order_date,customer_id FROM ORDERS
  5. *
  6. ERROR at line 1:
  7. ORA-01402: view WITH CHECK OPTION where-clause violation

这里子查询中的SELECT子句上没有order_total列,则是不允许插入的。


如果不加WITH CHECK OPTION则在插入时不会检查where条件。即如果你在创建视图时,使用where 子句限制时没有使用到 with check option 子句 时,当你在通过视图插入数据时,oracle 就不会检查 where 子句的限制条件。



上面是insert语句的例子,下面是update语句的例子。

创建一个显示销售部的雇员的视图 (SQL):

  1. 键入以下语句:

    CREATE VIEW sales_employeeAS SELECT emp_id, emp_fname, emp_lname, dept_idFROM employeeWHERE dept_id = 200WITH CHECK OPTION

    该视图的内容如下所示:

    SELECT *FROM sales_employee

    它们在 Interactive SQL 中的形式如下所示:

    emp_id emp_fname emp_lname dept_id
    129 Philip Chin 200
    195 Marc Dill 200
    299 Rollin Overbey 200
    467 James Klobucher 200
    ... ... ... ...
  2. 将 Philip Chin 调到市场部 ,即

    UPDATE sales_employeeSET dept_id = 400 WHERE emp_id = 129

当执行 该 UPDATE 语句时,会生成以下错误消息:

在基表'employee' 中插入/ 更新时WITH CHECK OPTION 违规(ORA-01402?)



删除我就不再试了,总之,当创建的视图中带有with check option 子句时,只DML的结果满足创建的视图中的where子句条件,DML就可以正常进行。



with check option 子句应用于内联视图(in-line view)中的例子,详见下文:

Oracle INSERT WITH CHECK OPTION的用法


insert into (

推荐阅读
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 浅析PHP中$_SERVER[
    在PHP后端开发中,`$_SERVER["HTTP_REFERER"]` 是一个非常有用的超级全局变量,它可以获取用户访问当前页面之前的URL。本文将详细介绍该变量的使用方法及其在不同场景下的应用,如页面跳转跟踪、安全验证和用户行为分析等。通过实例解析,帮助开发者更好地理解和利用这一功能。 ... [详细]
  • 从用户转型为开发者:一场思维升级的旅程 | 专访 StarRocks Committer 周威
    从用户转变为开发者,不仅是一次角色的转换,更是一场深刻的思维升级之旅。本次专访中,StarRocks Committer 周威分享了他如何在这一过程中逐步提升技术能力与思维方式,为开源社区贡献自己的力量。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • 获取贵州省毕节市高分辨率谷歌卫星影像图
    毕节市,作为贵州省西北部的重要地级市,地处乌蒙山脉核心区域,是连接四川、云南和贵州三省的关键节点。本研究旨在获取该地区的高分辨率谷歌卫星影像图,以全面展示其独特的地理特征和城市布局。通过这些高清影像,研究人员能够更深入地分析毕节市的自然环境、城市规划及发展状况。 ... [详细]
  • 在Tableau中进行多表关联后统计时遇到的常见问题及解决方法
    在使用Tableau进行多表关联统计时,常遇到数据不匹配、重复记录等问题。例如,在处理员工信息表时,若员工ID未正确关联,可能导致薪资统计错误。本文将详细探讨这些问题的成因,并提供有效的解决方案,如利用Tableau的数据清理工具和高级连接功能,确保数据准确性和完整性。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 六个接私活的平台,技术在手,财富自由!值得推荐给每一位专业人士!
    本文将介绍六个适合专业人士接私活的平台,帮助技术人才实现财富自由。这些平台不仅提供了丰富的项目机会,还为用户搭建了高效的合作桥梁,是每位技术人士不容错过的资源。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
author-avatar
宗小胖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有