阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle数据库对象_视图

112次阅读
没有评论

共计 3426 个字符,预计需要花费 9 分钟才能阅读完成。

视图是一种非常重要的数据库对象,它的形式类似于普通表,我们可以从视图中查询数据。

实际上它是建立在表上的一种虚表,在视图中并不存储真正的数据,而是仅仅保存一条 SELECT 语句,对视图的访问将被转化为对表的访问。

视图所基于的表称为基表,而视图可以认为是对基表的一种查询操作。

使用视图的主要目的是为了方便用户访问基表,以及保证用户对基表的安全访问。

对用户而言,往往要对一个表进行大量的查询操作,如果查询操作比较复杂,并且需要频繁地进行,那么可以为这个查询定义一个视图。

需要注意的是,在视图中并不保存对基表的查询结果,而仅仅保存一条 SELECT 语句。

只有当访问视图时,数据库服务器才去执行视图中的 SELECT 语句,从基表中查询数据。

虽然我们对视图没有做过任何修改,但是对视图的多次访问可能得到不同的结果,因为基表中的数据可能随时被修改。

所以视图中并不存储静态的数据,而是从基表中动态查询的。

从另外一个角度来看,视图可以保证对基表的安全访问。

在设计表时,我们一般是从整体的角度来考虑表的结构的,而不是从每个用户的角度来确定表结构以及定义允许的操作。

对于同一个表,不同的用户可以进行不同的操作,可以访问不同的数据。

这样我们就可以为不同的用户定义不同的视图,从而保证用户只能进行允许的操作,访问特定的数据。

视图的创建、修改和删除

用户可以在自己的模式中创建视图,只要具有 CREATE VIEW 这个系统权限即可。

如果希望在其他用户的模式中创建视图,则需要具有CREATE ANY VIEW 系统权限。

如果一个视图的基表是其他用户模式中的对象,那么当前用户需要具有对这个基表的 SELECT 权限。

创建视图的命令是 CREATE VIEW,这条命令的格式为:

CREATE OR REPLACE 视图名称

AS SELECT 语句

WITH READ ONLY

WITH CHECK OPTION;

其中最后两个选项是可选的,其中“WITH READ ONLY”限定对视图只能进行查询操作,不能进行 DML 操作。
“WITH CHECK OPTION”限定 DML 操作必须满足一定的条件。

视图被创建之后,可以通过 DESC 命令 查看视图的结构。

查看视图结构的方法与查看表的方法相同,查看的结果是列出视图中各列的定义。

视图的结构是在执行 CREATE VIEW 语句创建视图时确定的,在默认情况下,列的名称与 SELECT 之后基表的列名相同,数据类型和是否为空也继承了基表中的相应列。

如果希望视图中的各列使用不同的名字,那么在创建视图时,在视图的名称之后应该指定各列的名称。

视图作为一种数据库对象,它的相关信息被存储在数据字典中。

与当前用户的视图有关的数据字典是USER_VIEWS,查询这个数据字典,可以获得当前用户的视图的相关信息。

数据字典视图USER_VIEWS 各列的定义及其意义如下:

名称 意义

VIEW_NAME Name of the view
TEXT_LENGTH Length of the view text
TEXT           View text
TYPE_TEXT_LENGTH    Length of the type clause of the object view
TYPE_TEXT     Type clause of the object view
OID_TEXT_LENGTH   Length of the WITH OBJECT OID clause of the object view
OID_TEXT   WITH OBJECT OID clause of the object view
VIEW_TYPE_OWNER   Owner of the type of the view if the view is a object view
VIEW_TYPE   Type of the view if the view is a object view
SUPERVIEW_NAME   Name of the superview, if view is a subview
EDITIONING_VIEW   An indicator of whether the view is an Editioning View
READ_ONLY   An indicator of whether the view is a Read Only View

注:indicator 指示符。

在列 TEXT 中存储的是创建视图时使用的 SELECT 语句。

另外,在数据字典 ALL_ VIEWS 存储的是当前用户可以访问的所有视图的信息,在数据字典 DBA_VIEWS 存储的是系统中的所有视图的信息,这个数据字典只有 DBA 可以访问。

如果发现视图的定义不合适,可以对其进行修改。

实际上视图中的 SELECT 语句是不能直接修改的,所以修改视图的一种方陆是先删除视图,再重新创建,另一种方怯是在创建视图的 CREATE 语句中使用 OR REPLACE 选项。

视图在不需要时,可以将其从数据库中删除。

删除视图的命令是DROP VIEW

用户可以直接删除自己创建的视图,如果希望删除其他用户创建的视图,则需要具有DROP ANY VIEW 这个系统权限。

DROP VIEW 命令的格式为:

DROP VIEW 视图名称;

视图被删除后,相关的信息也被从数据字典中删除。

如何对视图进行访问

对视图的访问包括 查询 受限制的 DML 操作

访问视图的方法与访问表的方法基本相同。

在访问视图时,这种访问被转化为对基表的访问,所以在视图上执行 DML 操作时,也要遵守基表上的约束。

复杂视图

以前在创建视图时,在 CREATE VIEW 语句的 SELECT 子句中 只涉及一个表的操作 ,并且只是对 基表中的列进行简单的查询 ,并没有出现 多个基表 ,或者对 基表中的列进行表达式运算 或者 函数运算 的情况,这种视图被称为 简单视图

对简单视图不仅可以进行查询操作,还可以进行 DML 操作。

复杂视图 是这样的视图,视图中的列是从基表中的列经过表达式或函数运算而来,或者是对基表进行了DISTINCT 查询,或者、涉及多个表的操作。

总而言之,如果在用 CREATE VIEW 语句创建视图时,在 SELECT 之后的列名中使用了表达式、函数,或者使用了 DISTINCT 关键字,或者对多个表进行了连接查询,这样的视图都是复杂视图。

创建复杂视图仍然是通过执行 CREATE VIEW 命令完成的,只不过因为在 SELECT 子句中使用了表达式或者函数,这样的运算式不能作为视图中的列名,所以 在创建复杂视图时必须为每个列指定列名。

对复杂视图,允许的操作只有查询,大部分视图不允许 DML 操作。

现在我们总结一下在什么样的视图上可以执行 DML 操作,在什么样的视图不允许执行 DML 操作。

对于简单视图,如果基表中的所有列都被包含在视图中,或者至少主键列和所有不允许为空的列都被包含在视图中,并且在创建视图的 CREATE VIEW 语句的 SELECT 语句中最多只使用了 WHERE 子句,对这样的视图是可以进行插入、删除、修改操作的。

如果在创建这样的简单视图时使用了 WITH CHECK OPTION 选项,那么执行 DML 操作时要遵守一定的约束条件。

对于涉及多个基表的复杂视图,如果其中至少一个表的所有列都被包含在视图中,或者至少一个表的主键列和所有不允许为空的列都被包含在视图中,并且在创建视图的 CREATEVIEW 语句的 SELECT 语句中最多只使用了 WHERE 子句,这样的视图是允许进行插入、删除、修改操作的。

对这样的视图进行 DML 操作时,只有其中一个表可以被修改,并且被修改的列只能映射到一个表中。

对于只涉及一个基表的复杂视图,如果视图中的列是对基表的列经过某种运算而来,包括 表达式AVG 等函数,或者在创建视图的 CREATE VIEW 语句的 SELECT 语句中使用了DISTINCT 关键字GROUP 子句,对这样的视图是不能进行 DML 操作的。

对于涉及多个表的视图,如果视图中的列没有包含其中一个表中的所有主键列和所有不为空的列,或者视图中的部分列是经过对基表中的列经过某种运算而来的,或者在创建视图时在 SELECT 子句中使用了 DISTINCT 关键字、GROUP 子句,这样的视图也是不能进行 DML 操作的。

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131433.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3426字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中