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

  • 格式:doc
  • 大小:41.00 KB
  • 文档页数:4

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视图非常强大的功能之一在于其可以创 建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成 视图里的该字段名称,那么视图马上就可以成为合法的。 基表和数据字典视图 数据字典包含对数据库中的对象的说明。它包括两种对象类型。 基表: 基表是存储有关数据库的信息的底层表。基表是在任何Oracle 数据库中首先创建的对象。 在使用 CREATE DATABASE创建数据库时,只要Oracle 服务器运行 sql.bsq脚本,就会 自动创建这些对象。只有Oracle 服务器才能对这些基表执行写入操作。用户很少直接访问 基表,因为其中的数据大多数都是以隐含格式存储的。切勿使用DML 命令直接更新基 表,但 AUD$ 表除外。例如,IND$表就是一个基表,它包含有关数据库中的索引的信息 。 数据字典视图: 数据字典视图是基表的汇总,可以更有效地显示基表信息。例如,在数据字典视图中,除了显示对象编号外还会使用对象名。数据字典视图是在运行 CREATE DATABASE 命令之 后使用 catalog.sql脚本创建的。 oracle基表和动态性能视图 1. 数据字典是oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息。它是只读表和视图的集合,所有者为sys用户。用户自能在数据字典上执行查询操作,而维护和修改是由系统自动完成的。 数据字典包括数据字典基表和数据字典视图,其中基表存储数据库的基表信息,普通用户不能直接访问数据字典的基表;数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典视图取得系统信息。 数据字典视图主要包括三种类型:user_xxx, all_xxx, dba_xxx user_tables:显示当前用户下所拥有的所有表。它只返回当前用户所有表。 all_talbes: 显示当前用户可访问的所有表。 dba_talbes: 显示所有用户的所有表。要求查询用户拥有dba角色或者select any table系统权限。 user_xxx < all_xxx <= dba_xxx SQL> create user tt identified by tt; 用户已创建。 SQL> grant resource,connect to tt; 授权成功。 SQL> conn tt/tt 已连接。 SQL> select count(*) from user_tables; COUNT(*) ---------- 0 SQL> select count(*) from all_tables; COUNT(*) ---------- 91 SQL> select count(*) from dba_tables; select count(*) from dba_tables * 第 1 行出现错误: ORA-00942: 表或视图不存在 查询dba_tables的时候,必须有dba角色或者select any talbes 的系统权限。否则会报错。

在建立用户时,oracle会把用户的信息放到数据字典中。 dba_users:可查询用户的一些信息。 dba_roles: 可查询oracle有多少角色。 dba_sys_privs:可查询用户所具有的系统权限 system_privilege_map:可查询用户所具有的系统权限 dba_tab_privs: 可查询用户所具有的对象权限。 dba_role_privs: 可查询用户所拥有的角色。 dba_tablespaces:可查询出oracle表空间信息。