`
qjoycn
  • 浏览: 1217323 次
文章分类
社区版块
存档分类
最新评论

Oracle 视图(View) 说明

 
阅读更多

. 视图的定义

视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候, 只是重新执行SQL.

视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。

视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。

视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。

还有一种视图:物化视图(MATERIALIZED VIEW ,也称实体化视图,快照 8i 以前的说法) ,它是含有数据的,占用存储空间。 关于物化视图,具体参考我的blog

Oracle 物化视图

http://blog.csdn.net/tianlesoftware/archive/2009/10/23/4713553.aspx

. 视图的作用

2.1 简单性

看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

2.2 安全性。

通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过Oracle视图,用户可以被限制在数据的不同子集上:

使用权限可被限制在基表的行的子集上。

使用权限可被限制在基表的列的子集上。

使用权限可被限制在基表的行和列的子集上。

使用权限可被限制在多个基表的连接所限定的行上。

使用权限可被限制在基表中的数据的统计汇总上。

使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。

视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下:

1 在表中增加一个标志用户名的列;

2 建立Oracle视图,是用户只能看到标有自己用户名的行;

3 把视图授权给其他用户。

2.3 逻辑数据独立性。

视图可帮助用户屏蔽真实表结构变化带来的影响。

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立:

1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。

2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。

3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。

4 如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。

. 视图的基本语法:

CREATE[OR REPLACE][FORCE][NOFORCE]VIEW view_name

[(column_name)[,….n]]

AS

Select_statement

[WITH CHECK OPTION[CONSTRAINT constraint_name]]

[WITH READ ONLY]

说明:

view_name : 视图的名字

column_name: 视图中的列名

在下列情况下 , 必须指定视图列的名称

* 由算术表达式 , 系统内置函数或者常量得到的列

* 共享同一个表名连接得到的列

* 希望视图中的列名与表中的列名不同的时候

REPLACE: 如果创建视图时, 已经存在此视图, 则重新创建此视图, 相当于覆盖

FORCE: 强制创建视图, 无论的视图所依赖的基表否存在或是否有权限创建

NOFORCE: 只有基表存在且具有创建视图权限时, 才可以创建视图

WITH CHECK OPTION 指出在视图上所进行的修改都要符合select_statement 所指定的限制条件

WITH READ ONLY 只允许查看视图

视图的定义原则:
1.
视图的查询可以使用复杂的 SELECT 语法,包括连接 / 分组查询和子查询;
2.
在没有 WITH CHECK OPTION READ ONLY的情况下,查询中不能使用
ORDER BY
子句;
3.
如果没有为 CHECK OPTION 约束命名,系统会自动为之命名,形式为 SYS_Cn;
4. OR REPLACE
选项可以不删除原视图便可更改其定义并重建,或重新授予对象

权限。

. 视图操作

视图分为简单视图( 基于单个基表,且不包含函数和数据分组操作 ) 复杂视图( 基于多个基表或视图).

简单视图可以通过视图修改数据. 这些修改包括插入数据. 更新数据和删除数据. 但是对于复杂视图来说, 通过视图修改数据必须满足一定的规则.

在视图定义中没有设定READ ONLY 的前提下, 如果视图包含了下面的内容, 那么不能通过视图删除表中的数据:

* 分组函数, SUM,AVG,MIN,MAX

* GROUP BY 子句

* 包含了表达式

* ROWNUM 伪列

插入数据时, 除了满足上面的条件外, 还需要保证那些没有包含在视图定义中的基表的列必须允许空值. 如果在视图定义中还包含了WITH CHECK OPTION 子句, 那么对视图的修改除了前面的那些原则外, 还必须满足指定的约束条件. 个人认为,视图利于查询,不利于修改.

1. 查询视图: 可依赖于多个基表.

SELECT * FROM view_name; /* 类似于查询表数据*/

2. 更新视图的前提:

没有使用连接函数, 集合运算和组函数. 创建视图的select 语句中没有集合函数且没有GROUP BY,ONNECT BY ,START WITH 子句及DISTINCT 关键字. 创建视图的SELECT 语句中不包含从基表列通过计算所得的列. 创建视图没有包含只读属性.

3. 插入数据

INSERT INTO view_name VALUES();

4. 修改数据:

UPDATE view_name SET …

若一个视图依赖于多个基本表, 则一次修改该视图只能修改一个基本表的数据.

5. 删除数据:

Delete from view_name where …

同样, 当视图依赖多个基表时, 不能使用此语句来删除基表中的数据. 只能删除依赖一个基表的数据.

6. 修改视图定义:

修改视图的好处在于, 所有相关的权限都依然存在. 语法同创建视图相同.

7. 删除视图:

DROP VIEW view_name;

只有视图所有者和具备DROP VIEW 权限的用户可以删除视图。删除视图的定义不影响基表中的数据。视图被删除后,基于被删除视图的其他视图或应用将无效。

. 示例

5.1 dba_segments 表里没有视图的信息

SQL> select distinct(segment_type) from dba_segments group by segment_type;

SEGMENT_TYPE

------------------

LOBINDEX

INDEX PARTITION

NESTED TABLE

TABLE PARTITION

ROLLBACK

LOB PARTITION

LOBSEGMENT

TABLE

INDEX

CLUSTER

TYPE2 UNDO

已选择11行。

5.2 对视图的增删改操作都是在基表上进行的。

SQL> create table v_dave(id number,name varchar2(20));

表已创建。

SQL> insert into v_dave values(1,'dave');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from v_dave;

ID NAME

---------- --------------------

1 dave

SQL> create view view_dave as select * from v_dave;

视图已创建。

SQL> select * from view_dave;

ID NAME

---------- --------------------

1 dave

上面我们创建了一个表和一个视图。 下面我们对视图进行增删改操作。

5.2.1 对视图进行insert 操作

SQL> insert into view_dave values(2,'tianlesoftware');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from v_dave;

ID NAME

---------- --------------------

1 dave

2 tianlesoftware

SQL> select * from view_dave;

ID NAME

---------- --------------------

1 dave

2 tianlesoftware

最视图添加的记录,写道了对应的基表里。

5.2.2 对视图进行delete 操作

SQL> delete from view_dave where id =2;

已删除 1 行。

SQL> commit;

提交完成。

SQL> select * from view_dave;

ID NAME

---------- --------------------

1 dave

SQL> select * from v_dave;

ID NAME

---------- --------------------

1 dave

对视图的delete,同样修改的是基表。

5.2.3 对视图进行update

SQL> update view_dave set name='tianlesoftware' where id=1;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select * from v_dave;

ID NAME

---------- --------------------

1 tianlesoftware

SQL> select * from view_dave;

ID NAME

---------- --------------------

1 tianlesoftware

5.3 查看视图的信息dba_views

SQL> desc dba_views;

名称 是否为空? 类型

----------------------------------------- -------- ----------------

OWNER NOT NULL VARCHAR2(30)

VIEW_NAME NOT NULL VARCHAR2(30)

TEXT_LENGTH NUMBER

TEXT LONG

TYPE_TEXT_LENGTH NUMBER

TYPE_TEXT VARCHAR2(4000)

OID_TEXT_LENGTH NUMBER

OID_TEXT VARCHAR2(4000)

VIEW_TYPE_OWNER VARCHAR2(30)

VIEW_TYPE VARCHAR2(30)

SUPERVIEW_NAME VARCHAR2(30)

EDITIONING_VIEW VARCHAR2(1)

READ_ONLY VARCHAR2(1)

查看视图的定义:

SQL> select text from dba_views where view_name='VIEW_DAVE';

TEXT

--------------------------------------------------------------

select "ID","NAME" from v_dave

注:整理自网络

------------------------------------------------------------------------------

Blog http://blog.csdn.net/tianlesoftware

网上资源: http://tianlesoftware.download.csdn.net

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(); DBA2 群:62697977()

DBA3 群:62697850 DBA 超级群:63306533;

聊天 群:40132017

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

分享到:
评论

相关推荐

    Oracle_View视图创建

    Oracle_View视图创建在oracle数据库中已建立两张表rt_issuesect和roadstate,表结构如下: 高架状态表结构rt_issuesect

    如何在Oracle或SQLServer中对视图(view)加密以保护视图中的SQL代码?

    因Oracle暂不支持对视图(View)的加密,在实际工作中有时需提供给第三方只读账户,为保护知识产权,可用文中所述方法防止第三方账户查看视图(View)中的SQL代码。

    Oracle创建视图(View)

    WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不...

    Oracle 视图详解

    Oracle 视图详解,详细阐述了视图的信息,免费分享

    oracle 视图,函数,过程,触发器自动编译脚本

    日常管理维护一个oracle数据库服务器的时,经常会碰到修改view,table结构的情况,而且由于oracle view,函数,存储过程等对象的相互关联的关系,经常会由于一个view,table,fun,proc的修改而导致相关的对象失效。...

    oracle视图详解

    讲述oracle中视图的用法。视图定义、视图作用、视图语法、视图操作等等。

    oracle笔记视图

    oracle笔记视图,有视图的具体代码案例!视图的知识点笔记,视图的注意事项!

    oracle系统视图作用大全

    描述了ORACLE数据库数据字典中各类视图的功能

    oracle_11gR2_09 视图 VIEW 的介绍(

    oracle_11gR2_09 视图 VIEW 的介绍

    ORACLE_视图的_with_check_option.doc

    ORACLE 视图的 with check option

    Oracle的V$性能视图学习大全

    比较详细的介绍了Oracle的V$性能视图的使用方法及技巧。 摘要:高级DBA经常告诉刚刚入行的DBA,在Oracle 6年代,他们曾经将每一张V$视图烂熟于心。在Oracle 6中,仅仅只有23个V$视图,那时侯的DBA可以很轻松地使用...

    oracle视图和索引

    什么是视图【View】?  (1)视图是一种虚表  (2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表  (3)向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句  ...

    oracle 视图权限 oracle 创建视图权限不足

    解决方法: 以dba用户登录 [sql] 代码如下: sqlplus / as sysdba 赋予scott用户创建VIEW的权限 [sql] 代码如下: grant create view to scott 以scott用户登录oracle [sql] 代码如下: conn scott/tiger 创建视图成功 ...

    oracle基础教程

    1.3.4 视图(View) 18 1.3.5 索引(Index) 18 1.3.6 同义词(Synonym) 19 1.3.7 序列(Sequence) 19 1.3.8 数据库链(Database Link) 20 第2章 管理ORACLE数据库 21 2.1 基本概念 21 2.1.1 数据字典 21 2.1.2 ...

    oracle materialized view

    物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照(声名:本人刚刚学习物化视图这篇文章来自网络感觉有借鉴...

    Oracle中管理物化视图变得更加容易

    利用强制查询重写和新的强大的调整顾问程序—它们使您不再需要凭猜测进行工作 ,在 10g 中管理物化视图变得更加容易。文中介绍了物化视图的定义及其一些功能。

    Oracle创建带有参数的视图代码介绍

    在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现 首先定义程序包: /* 按个人需要定义,我定义三个参数 ,因我项目程序需要,所以三个参数都是number ,当然可...

    Oracle10g_Views.pdf

    10g的经典视图。网上找到。 Oracle10g_Views.pdf

    SQL实验六 Oracle数据字典和ODBC

    了解Oracle数据字典 ODBC 数据字典(data dictionary)是存储在数据库中的所有对象信息的知识库。Oracle RDBMS使用数据字典获取对象信息和安全信息,而用户和... O——view with read only ………………………………

    青云oracle工具

    7.oracle 有个特点,就是如果表结构发生变化,就会有很多视图,存储过程,触发器等跟着失效,这时候要把这些无效的对象重新编译一下。但是这个动作会经常遗忘, 所以我这里加了一个检索并修正无效对象的功能; 8....

Global site tag (gtag.js) - Google Analytics