一、索引简介:

索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低I/O次数,从而提高数据访问性能。索引有很多种主要介绍常用的几种:

1-单列索引:

单列索引是基于单个列所建立的索引,语法:

create index 索引名 on 表名(列名)

范例1:创建单列索引

SQL> create indexnameIndexon customer(name);

Index created

2-复合索引:

复合索引是基于两列或多列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同。

范例2:创建复合索引:

SQL> create index emp_idx1 on emp (ename,job);
Index created

SQL> create index emp_idx2 on emp (job,ename);
Index created

SQL>

3-索引使用原则:

(1) 在大表上建立索引才有意义;

(2) 在where子句或是连接条件上经常引用的列上建立索引;

(3) 索引的层次不要超过4层.

4-索引据点分析:

万事万物都有两面性,索引也不例外,有些先天不足之处:

(1) 建立索引,系统占用大约为表的1.2倍的硬盘和内存空间来保存索引;

(2) 更新数据时,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性;

(3) 建立不恰当的索引,不但于事无补,反而会降低系统性能.因大量的索引在进行插入、修改和删除操作时比没有索引花费的系统时间更多。

PS:注意点!如下几点是不应该建立索引:

(1) 很少或从不引用的字段;

(2) 逻辑型的字段,如:男或女(是或否)等。

由可见,有取就有舍,舍和得有时就泾渭分明。提高查询效率是以消耗一定的系统资源为代价的。

5-如何显示表的索引:

(1)显示表的所有索引;

在同一张表上可以有多个索引,通过查询数据字典视图dba_indexes和user_indexes,可以显示索引信息。

* dba_indexes用于显示数据库所有的索引信息;

* user_indexes用于显示当前用户的索引信息。

范例3:如查看范例1中创建单列索引:

方法1:通过PL/SQL Developer工具查看索引信息:

p_w_picpath

方法2:使用命令行查看:

p_w_picpath


二、权限简介:

1-Oracle是如何管理权限和角色?权限和角色的区别在哪里?

当刚刚创建的Oracle用户时,该用户没有任何权限,也不能执行任何操作。

* 若要执行某种特定的数据库操作,则必须为其授予权限;

* 若用户要访问其它方案的对象时,则必须为其授予对象的权限;

为了简化权限的管理,于是引入了角色。(类似windows中的组,先把权限赋予该组,再把用户加入到该组,这样用户就拥有了该组的权限。)

2-数据库中的权限分为: 系统权限和对象权限

(1)系统权限:

a. 什么是系统权限?

b. 系统权限有哪些?

c. 如何赋给系统权限?

(2)对象权限:

a. 什么是对象权限?

b. 对象权限有哪些?

c. 怎么赋给对象权限?

范例:查询Oracle中所有的系统权限,一般是DBA

SQL> select * from system_privilege_map order by name;

范例:查询Oracle中所有对象权限,一般是DBA

SQL> select distinct privilege from dba_tab_privs;

范例:查询Oracle中所有的角色,一般是DBA

SQL> select * from dba_roles;

3-系统权限:

权限是指执行特定类型SQL命令或访问其它方案对象的权利,包括:系统权限和对象权限。

系统权限:是指执行特定类型SQL命令的权利。它用于控制用户可以执行的一个或一组数据库操作。

如:

* 用户具有create table权限时,可以在方案中建表;

* 用户具有create any table权限时,可以在任何方案中建表。

常用的有如下所示:

(1) create session 连接数据库;

(2) create table 建表;

(3) create view 建视图;

(4) create public synonym 建同义词;

(5) create procedure 建过程、函数、包;

(6) create trigger 建触发器;

(7) create cluster 建簇.

4-如何授予系统权限

范例:

(1)创建2个用户tom和ken ,密码均为oracle

SQL> create user tom identified by oracle;

SQL> create user ken identified by oracle;

PS: 扩展知识点:

SQL> select * from dba_role_privs where grantee='KEN';

GRANTEE GRANTED_ROLE

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

KEN CONNECT

SQL> revoke connect from ken; --回收赋予用户ken的connect权限。

撤销成功。

(2) 给用户ken授权create session(会话)、create table(创建表)和create view(创建视图)的权限

SQL> grant create session,create table to ken with admin option;

授权成功。

SQL> grant create view to ken;

授权成功。

SQL> conn ken/oracle@jiagulun; --检验ken能否登录!

已连接。

SQL>

(3)检验ken能否为tom分配权限

SQL> show user;

USER 为 "KEN"

SQL> grant create session,create table to tom with admin option;

授权成功。

SQL> grant create view to tom; --用户ken没有赋予tom的create view的权限!

grant create view to tom

*

第 1 行出现错误:

ORA-01031: 权限不足

(4) 如何回收系统权限:

范例:

回收赋予ken的create session的权限,ken还能登录吗?(No)用户tom还能登录吗?(Yes)

SQL> conn ken/oracle@jiagulun;

ERROR:

ORA-01045: user KEN lacks CREATE SESSION privilege; logon denied

警告: 您不再连接到 ORACLE

SQL> conn tom/oracle@jiagulun;

已连接。

SQL>

5-对象权限:

对象权限是指访问其它方案对象的权利,用户可以直接访问自己方案的对象,但是若要访问别的方案的对象,则必须具有对象的权限。

常用的有如下所示:

(1) alter 修改; (主要是修改表的结构)

(2) delete 删除;

(3) select 查询;

(4) insert 添加;

(5) update 修改; (主要是修改表的数据)

(6) index 索引;

(7) references 引用;

(8) execute 执行.

范例: grant 权限名 on 方案名.表名 to 用户名

(1)希望monkey可以查询scott.emp的表数据,怎样操作?

SQL> create user monkey identified by oracle; --创建用户monkey

用户已创建。

SQL> grant create session to monkey; --此时用户monkey还不能登录Oracle的权限,故给它!

授权成功。

SQL> show user;

USER 为 "MONKEY"

SQL> select * from scott.emp;

select * from scott.emp

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

//以用户system登录给monkey授权

SQL> show user;

USER 为 "SYSTEM"

SQL> grant create session to monkey;

授权成功。

SQL> grant select on scott.emp to monkey; --将scott方案中的emp表的查询权限赋予monkey

授权成功。

clip_p_w_picpath002

//如何回收monkey对scott方案中的emp表的select权限?

SQL>revokeselecton scott.emp from monkey;

撤销成功。

(2)希望monkey可以修改scott.emp的表数据,怎样操作?

SQL> grant updata on scott.emp from monkey;

(3)希望monkey可以删除scott.emp的表数据,怎样操作?

SQL>grant delete on scott.emp from monkey;

(4)希望monkey可以查询、修改、删除scott.emp的表数据,怎样操作?

SQL>grant all on scott.emp from monkey;

范例:用户scott将select查询赋予给blake用户,而blake用户又把select查询赋予jones用户,

问:如果scott将回收赋予给blake用户的 select查询权限,jones的select查询权限还在有吗?

(1)用户scott将select查询赋予给blake用户;

SQL> show user;

USER 为 "SYSTEM"

SQL> create user blake identified by oracle;

用户已创建。

SQL> conn scott/oracle@jiagulun;

已连接。

SQL> grant select on emp to blake with grant option;--grant对象权限admin系统权限

授权成功。

SQL>

(2)blanke用户又把select查询赋予jones用户;

SQL> show user;

USER 为 "BLAKE"

SQL> grant select on scott.emp to jones;

授权成功。

(3)如果scott将回收赋予给blanke用户的 select查询权限,jones的select查询权限还在有吗?

SQL> conn scott/oracle@jiagulun;

已连接。

SQL> show user;

USER 为 "SCOTT"

SQL> revokeselect on emp from blake;

撤销成功。

SQL> conn blake/oracle@jiagulun;

已连接。

SQL> select * from scott.emp;

select * from scott.emp

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

SQL> conn jones/oracle@jiagulun;

已连接。

SQL> show user;

USER 为 "JONES"

SQL> select * from scott.emp;

select * from scott.emp

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

SQL>

由案例可知:回收对象权限后,级联也会回收!

三、角色简介:

角色是相关权限的命令集合,使用角色的目的主要是简化权限的管理。

角色分为2种:预定角色和自定义角色

1-预定义角色是指Oracle所提供的角色,每种角色都用于执行一些特定珠管理任务。

如:connect、resource、dba等,就是预定义角色。

2. connect角色具有一般应用开发人员需要的大部分权限,建立了一个用户后,多数情况下,只要给用户授予connect和resource角色就够了!

(一) connect角色具有如下几种系统权限:

(1) alter session

(2) create cluster

(3) create database link

(4) create session

(5) create table

(6) create view

(7) create sequence

3. resource角色具有应用开发人员所需要的其它权限,如:存储过程、触发器等。注意:resource角色隐含了unlimited tablespace系统权限!

(二) resource角色包含如下几种系统权限:

(1) create cluster

(2) create indextype

(3) create table

(4) create sequence

(5) create type

(6) create procedure

(7) create trigger

3. dba角色具有所有的系统权限,及with admin option选项,默认的dba用户为sys和system。他们可将任何系统权限授予其它用户。但是dba角色不具备sysdba和sysoper的特权(启动和关闭数据库)!

2-自定义角色是指自己定义的角色,根据需要而定义。

一般是dba来建立,如果用的别的用户来建立,则该用户应具有create role的系统权限。建立角色时,可以指定验证方式(不验证数据库验证等)

(一) 建立角色且授权(不验证)

范例:

1)建立一个角色myrole1不验证且赋予create session(连接数据库的权限);

SQL> show user;

USER 为 "SYSTEM"

SQL> create role myrole1 not identified;

角色已创建。

SQL> grant create session to myrole1 with admin option;

授权成功。

SQL>

2)用户scottselectupdatedelete赋予myrole1角色;

SQL> conn scott/oracle@jiagulun;

已连接。

SQL> grant select on emp to myrole1;

授权成功。

SQL> grant update on emp to myrole1;

授权成功。

SQL> grant delete on emp to myrole1;

授权成功。

由上可知:角色myrole1现在拥有4个权限:create sessionselectupdatedelete权限!

(二) 分配角色给用户:

范例:用户system将角色myrole1赋予用户tony,检验角色是否真的拥有的create session、select、update、delete权限

SQL> conn system/oracle@jiagulun;

已连接。

SQL> grant myrole1 to tony;

授权成功。

SQL> conn tony/oracle@jiagulun;

已连接。

SQL> select * from scott.emp;

(三) 删除角色:

使用drop role删除角色,一般由dba来执行,如其它用户,则应具有drop any role系统权限。

范例: 如果将角色 myrole1删除了,刚才赋予tony的权限还存在吗?(皮之不存,毛将焉附?

SQL> conn system/oracle@jiagulun;

已连接。

SQL> show user;

USER 为 "SYSTEM"

SQL> drop role myrole1;

角色已删除。

SQL> conn tony/oracle@jiagulun;

ERROR:

ORA-01045: user TONY lacks CREATE SESSION privilege; logon denied

警告: 您不再连接到 ORACLE

SQL>

由上可知:如果将角色 myrole1删除了,刚才赋予tony的权限存在