第三章: Oracle 视图,同义词,序列。

3.1视图的用途?

1)限制数据的存取:用户只能看到基表的部分信息。方法:赋予用户访问视图对象的权限,而不是表的对象权限。

2)使得复杂的查询变得容易(内联视图):

3) 提供数据的独立性。

3.2 视图的分类

特性                            简单视图                                 复杂视图

表的个数                       一个                                       一个或多个

含函数                             无                                            有

含组函数                          无                                            有

含DISTINCT                     无                                            有

DML 操作                           可以                                        不一定

3.3 语法

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[,alias]...)]

AS subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY];

3.3.1 FORCE 作用: 可以先建视图,后建基表

3.3.2 WITH CHECK OPTION 作用:对视图where 子句进行约束。不允许对限定关键字修改。


SCOTT@orcl> create view view2 as select * from emp where deptno = 10 with check option;

3.3.3 WITH READ ONLY 作用:禁止对视图执行DML操作。

SCOTT@orcl> create view view3 as select * from emp where deptno = 10 with read only;

3.3.4 关于视图注意事项。

1) 只要视图中的数据不是来自基表的原始数据,就尽量不要对该数据做DML 操作。

2) 视图的DML操作。

含有如下情况,则不能删除视图中的数据:

含有聚合函数

含有group by 子句

含有 distinct 关键字

含有rownum 这个伪列

含有如下情况,不能修改该视图中的数据:

上面提到的任何一种情况

列由表达式来进行定义的

含有如下情况,不能增加该视图中的数据:

上面提到的任何一种情况。

在基表中包含有NOT NULL约束的列,然而该列并没有在视图中出现

3.3.5 复杂视图的更新,键保留表概念。

select * from user_views ;

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

4. 同义词

从字面上理解就是别名的意思,和视图的功能相似。就是一种映射关系。

4.1 私有同义词:

一般是普通用户自己建立的同义词,创建者需要create synonym 权限。

SYS@orcl> grant create synonym to scott; //sys 授权给 scott 建立私有同义词权限 

Grant succeeded.

Elapsed: 00:00:00.26
SYS@orcl> conn scott/tiger;
Connected.
SCOTT@orcl> create synonym abc for emp;  //scott 建立了一个私有同义词 

Synonym created.

Elapsed: 00:00:00.27
SCOTT@orcl> select * from abc;   //scott 可以使用这个私有同义词了 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800 <null>             20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975 <null>             20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850 <null>             30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450 <null>             10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000 <null>             20
      7839 KING       PRESIDENT <null>     17-NOV-81       5000 <null>             10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100 <null>             20
      7900 JAMES      CLERK           7698 03-DEC-81        950 <null>             30
      7902 FORD       ANALYST         7566 03-DEC-81       3000 <null>             20
      7934 MILLER     CLERK           7782 23-JAN-82       1300 <null>             10

14 rows selected.

Elapsed: 00:00:00.02
SCOTT@orcl> 

如何让tim 用户也使用这个私有同义词。

SCOTT@orcl> grant select on scott.emp to tim;   //把访问基表的对象权限给 tim

TIM@orcl> select * from scott.abc;   //tim 使用同义词时加模式名前缀,OK。

4.2 公有同义词:

一般是由DBA创建,使所有用户都可以使用,创建者需要CREATE PUBLIC SYNONYM 权限。

create public synonym syn2 for ...

(新用户要访问 public synonym(代表 emp 表), 需要有访问基表的权限。

select * from tab; (tab 是什么?); 用下面的查看语句: 
 
select * from all_objects where object_name='TAB';

select * from all_synonyms where synonym_name='TAB'; 

查看同义词的视图:dba_synonyms

删除私有同义词:drop synonym 同义词名

删除公有同义词:drop public synonym 同义词名 
 
SYS@orcl> select * from dba_synonyms where synonym_name='SYN1';

4.3 关于同义词的几个要点: 


 
1)私有同义词是模式对象,一般在自己的模式中使用,如其他模式使用则必须用模式名前缀 限定。 
 
2)公有同义词不是模式对象,不能用模式名做前缀。(考点) 
 
3)私有和公有同义词同名时,如果指向不同的对象,私有同义词优先。 
 
4)引用的同义词的对象(表或视图)被删除了,同义词仍然存在,这同视图类似,重新创建 该对象名,下次访问同义词时自动编译

5.0 序列

5.1 序列是生成唯一整数值的结构,它的典型用途是用于主键值。

结合真题演示 伪列 nextval, currval 用法 
 

SYS@orcl> create sequence dept_deptno
  2  increment by 10
  3  start with 50
  4  maxvalue 100
  5  cycle
  6  nocache;

Sequence created.

Elapsed: 00:00:00.13


第一次要引用一下 nextval 伪列

select dept_deptno.nextval from dual;

以后就有 currval 伪列值了。

select dept_deptno.nextval from dual; 
 


15.2 几点说明: 
 
1)最简单的建立序列只需要 create sequence 序列名就可以,注意缺省值,起始是 1,步长 也是 1。 2) 如果启用 cache,缺省只有 20 个号,经验表明这个数量会不够,可以设置多一些,根据 需要 10000 个也可以。 

 
3) cycle 其实没有什么意义,因为它使序列发出重复值,这对于基于序列是主键值的用法是 个问题。 4) 创建序列后可以使用 alter 命令再进行修改。alter 命令和 create 命令基本相同,只有 一点区别:alter 命令不能设置起始值。如果要重启该序列,唯一的办法是删除并重新创建 它。 5) 循环后初始是从 1 开始的, 不管原来的值是如何设的(考点)。

发布了39 篇原创文章 · 获赞 4 · 访问量 3480

猜你喜欢

转载自blog.csdn.net/u011868279/article/details/100866288
今日推荐