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

Oracle数据库视图与基表的关系

Oracle视图非常强大的功能之一在于其可以创建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,

Oracle视图非常强大的功能之一在于其可以创 建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,

一:首先解释什么是视图:视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表,与真实表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间,并且基表的变化会导致视图相应的改变。

二:视图的创建:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
其中:
OR REPLACE:若所创建的试图已经存在,Oracle自动重建该视图;
FORCE:不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE:只有基表都存在ORACLE才会创建该视图:
alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名 可以挑选某个表中你需要的属性;
WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY : 该视图上不能进行任何DML操作。
三:视图的修改:直接利用前边创建时的or replaece 重建即可。

四:视图上的DML 操作:

1,一般简单视图,也就是基表只有一个的视图,是可以通过修改视图来修改基表的,
Oracle是可以通过视图来修改Base table的。所谓base table就是用来构建视图的表,也就是视图的数据来源表。但是这种修改是有条件的。比如:
create view v_emp as select empno,ename,job,deptno from emp where deptno=10 with check option constraint emp_cnst;
如果有这个限制,那么通过视图v_emp 插入数据的deptno字段的值必须是10,否则就会报“ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句”的异常。
2.针对复杂视图,也就是基表有多个表,通过内连接查询建立的视图,只能通过视图来修改key_preserved表,
什么是Key-Preserved Table呢.Oracle给出的定义是:
A table is key preserved if every key of the table can also be a key of the result of the join.
It is not necessary that the key or keys of a table be selected for it to be key preserved.

It is sufficient that if the key or keys were selected, then they would also be key(s) of the result of the join.

如果某一个表的主键可以作为这个join结果(view通常是几个表的join结果)的主键,那么这个表就是key preserved table.

这个表的主键并非一定要出现在select出来的结果集中(select list里面),但是如果其出现在结果集中,那么它必须可以满足作为这个结果集的主键的要求.

通过下面的例子来解释:

create view liuwenhe as select e.ename, e.empno, e.job, d.deptno, d.dname from emp e,dept d where e.empno in (10,30) and e.deptno = d.deptno; emp表的主键是empno,dept表的主键是deptno,
可以看出来emp表的主键empno的值是唯一的,并且非空,所以是可以做查询结果集的主键的,但是结果集的dempno的值就不一定唯一了。所以这个视图的key_preserved表是emp,
五;视图的作用:减少复杂性和增强安全性。

1.视图可以隐藏你的查询的复杂性,例如:

SELECT d.dname,count(*) as NUM_EMPS
FROM emp e, dept d
WHERE e.deptno=d.deptno
GROUP BY dname;

不需要输入如此复杂的查询(按照今天的标准来说,那其实并不算是复杂),,我可以查询如下的一个视图:

SELECT dname,num_emps FROM my_view; (前提是你创建了基于上面查询的视图)

你也能够将好多相当复杂的查询存储为一个视图,这样就会将查询大大的简化。通过这种方式,视图就是一种宏,它可以在幕后做许多事情,并使得这个过程让终端用户或者应用程序看起来非常简单。
2,视图也可以用于加强安全性。让我们假设一下,我只想要用户BOB看到EMP表中的ENAME 和DEPNO两个列。我可以使用如下所示:
GRANT select ON emp TO bob;

但是上面的命令会使BOB看到表的全部内容。我可以写下如下的一个视图,使BOB只看到自己能够看到的列:

CREATE VIEW bob_emp AS SELECT ename,deptno FROM emp; GRANT select ON bob_emp TO bob;

通过这两条命令,BOBO只能在视图中看到这个表中的两个列。

让我们更进一步的讨论一下安全性的概念。假设我们想要使得每个人都可以查询EMP表,但是只是他们自己的记录。我可以写出如下的视图:

CREATE VIEW my_emp AS SELECT * FROM emp WHERE ename=USER; GRANT select ON my_emp TO public;

当一个用户查询MY_EMP表示,上述视图只会返回那些ENAME列值为他们自己的用户名

3.Oracle视图非常强大的功能之一在于其可以创 建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成 视图里的该字段名称,那么视图马上就可以成为合法的。

本文永久更新链接地址

推荐阅读
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • 非授权维修导致iPhone 8屏幕失灵:苹果新固件策略解析
    设备制造商通常希望用户通过官方或授权服务中心进行维修,以确保质量并保障收入。然而,对于消费者而言,价格更低、服务更便捷的非授权维修商更具吸引力。本文将探讨使用非授权服务商更换iPhone 8屏幕可能带来的问题及其背后的技术原因。 ... [详细]
  • 了解如何使用微软官方提供的工具,通过U盘轻松安装Windows 7。本文将详细介绍工具的下载和使用方法,并提供操作步骤。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本主题面向IT专业人士,介绍了Windows Server 2012 R2和Windows Server 2012中的组托管服务账户(gMSA),涵盖了其应用场景、功能改进、硬件和软件要求以及相关资源。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 百度贴吧APP密码修改指南
    如果您在注册百度贴吧APP时设置了较为简单的密码,现在可以按照本文提供的详细步骤轻松更改密码,确保账户安全。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 广东省通信管理局对违规App采取严厉措施
    为应对央视315晚会曝光的侵害用户权益问题,广东省通信管理局迅速行动,于3月16日上午对涉事公司主要负责人进行线上约谈,并启动立案调查。根据初步调查结果,将依法作出行政处罚,并及时公布处理情况。 ... [详细]
  • 本文详细介绍如何在Linux系统中配置SSH密钥对,以实现从一台主机到另一台主机的无密码登录。内容涵盖密钥对生成、公钥分发及权限设置等关键步骤。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
author-avatar
五环4_183
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有