索引
索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低I/O次数,从而提高数据访问性能。索引有很多种我们主要介绍常用的几种:
1、创建索引
(1)单列索引
单列索引是基于单个列所建立的索引,比如:
create index 索引名 on 表名(列名)
(2)复合索引
复合索引是基于两列或是多列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同,比如:
create index emp_idx1(索引名) on emp(ename,jod);//先按ename,再按job查 一般尽可能的将帅选最多的放在前面
create index emp_idx1(索引名) on emp(job,ename);//先按job查,再按ename查

(3)索引使用原则
1)在大表上建立索引才有意义
2)在where子句或是链接条件上经常引用的列上建立索引
3)索引的层次不要超过4层

(4)索引缺点分析
索引有一些先天不足:
1)建立索引,系统要占用大约为表的1.2倍的硬盘盒内存空间来保存索引。
2)更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。
实践证明,不恰当的所以不但无济于事,反而会降低系统性能。因为大量的索引在进行插入,修改和删除操作时比没有索引花费更多系统时间。

(5)索引按照数据存储方式,可以分为B*树,反向索引,位图索引;
按照索引列的个数分类可以分为单列索引和复合索引;
按照索引列值得唯一性,可以分为唯一索引和非唯一索引。此外还有函数索引,全局索引,分区索引。
一般B*树索引建立在重复值很少的列上,而位图索引则建立在重复值多、不同值相对固定的列上。

(6)显示表的所有索引
在同一张表上可以有多个索引,通过查询数据字典试图dba_indexs和user_indexes,可以显示索引信息。其中dba_indexes用于显示数据库索引信息,而user_indexs用于显示当前 用户的索引信息:
select index_name,index_type from user_indexes where table_name='表名';

(7)显示索引列
通过查询数据字典视图user_ind_columns,可以显示索引对应的列的信息:
select table_name,column_name from user_ind_columns where index_name='IND_ENAME';


二、管理权限
1、介绍
这一部分主要看看oracle是如何来管理权限和角色的,权限和角色的区别在什么地方?
当刚刚建立用户时,用户没有任何权限,也不能执行任何操作。如果要执行某种特定的数据库操作,则必须为其授予系统的权限;如果用户要访问其他方案的对象时,则必须为其授予对象的权限。为了简化权限的管理,可以使用角色。
2、权限
权限是执行特定类型sql命令或是访问其他方案对象的权利,包括系统权限和对象权限。
3、系统权限
系统权限是指执行特定类型的sql命令的权利,它用于控制用户可以执行的一个或是一组数据库操作。比如当用户具有create table权限时,可以在其方案中建表,当用户具有create any table权限时,可以在任何方案中建表。
常用的系统权限有:
create session 连接数据库 create table 建表 create view 建视图
4、显示系统权限
我们可以通过数据字典视图system_privilege_map,可以显示所有的系统权限
select * from system_privilege_map order by name;
5、授予系统权限
一般情况下,授予系统权限是要有dba身份完成的,如果用其他的用户来完成,则要求用户必须具有grant any privilege的系统权限,在授予系统权限时,可以带有with admin option选项,这样被授予权限的用户或是角色还可以将系统权限授予其他用户或者角色。
举例说明:
(1)创建两个用户ken,tom。初始化阶段他么没有任何权限,如果登陆就会出错
create user ken identified by ken;

(2)给用户ken授权,转授系统权限是采用:with admin option方式,注意其余转授对象权限的不同
方式一:grant create session ,create table to ken with admin option;//此时ken可以继续讲它的权限授予其他用户

方式二:grant create view to ken;

(3)给用户tom授权
grant create session ,create table to tom;
grant create view to tom;//error

6、回收系统权限【不是级联回收】
一般情况下,回收系统权限是dba来完成的,如果其它用户来回收系统权限,要求该用户必须具有相应系统权限及转授系统权限的选项(with admin option)。回收系统权限使用revoke来操作
当回收了系统权限后,用户就不能执行相应的操作了,但是请注意,系统权限级联收回问题。【不是级联回收】


7、对象权限介绍
指访问其他方案对象的权利,用户可以直接访问自己方案的对象,但是如果要访问别的方案的对象,则必须具有对象的权限。比如:
smith用户要访问scott.emp表(scott方案,emp表)则必须在scott.emp表上具有对象的权限。常用的对象权限有:
alter 修改表的结构 delete 删除 select 查询 insert 添加 update修改表的数据 index索引 reference 引用 execute执行

8、显示对象权限
通过数据字典视图可以显示用户或是角色所具有的对象权限。试图为dba_tab_privs
conn system/Manager@orcl
select distinct privilege from dba_tab_privs;
select grantor,owner,table_name,privilege from dba_tab_privs where grantee='BLAKE';

9、授予对象权限
授予对象权限是由对象的所有者来完成的,如果用其他用户来操作,则需要用户具有相应的with grant option 权限,从oracle9i开始,dba用户(system,sys)可以将任何对象上的对象权限授予其它用户。授予对象权限是用grant命令来完成的。
对象权限可以授予用户,角色和public 。在授予权限时,如果带有with grant option选项,则可以将该权限转授给其他用户。但是要注意with grant option 选项不能被授予角色。
(1)monkey用户要操作scott.emp表,则必须授予相应的对象权限
1)希望monkey用户可以查询scott.emp表的数据:grant select on emp to monkey;
2)希望monkey用户可以修改scott.emp表的数据:grant update on emp to monkey;
3)希望monkey用户可以删除scott.emp表的数据:grant delete on emp to monkey;
4)希望一次把所有的权限都赋给monkey用户:grant all on emp to monkey;

(2)能否对monkey访问权限更加精细控制
1)希望monkey只可修改scott.emp表的sal字段:grant update on emp(sal) to monkey;
2)希望monkey只可查询scott.emp的ename,sal数据:grant select on emp(ename,sal) to monkey;

(3)授予alter权限
如果black用户修改了scott.emp表的结构,则必须授予alter对象权限
grant alter on emp to black;

(4)授予execute权限
如果用户想要执行其他方案的包/过程/函数,则需有execute权限。比如为了让ken可以执行包dbms_transaction,可以授予execute权限。
grant execute on dbms_transaction to ken;

(5)授予index权限
如果想在别的方案的表上建立索引,则必须具有index对象权限。如为了让black可以在scott.emp上建立索引,就给其index的对象权限。
grant index on scott.emp to blake;

(6)使用with grant option 选项转授对象权限
该选项用于转授对象权限,但是该选项只能被授予用户,而不能授予角色
grant select on emp to black with grant option;//这必须是scott、system或sys用户来操作的

10、回收对象权限 【级联回收】
revoke select on emp from blake;
若一个用户将某对象权限赋予某用户,某用户有转授给另外用户,当收回对象权限时,是都收回。即级联回收。


三、管理角色
角色就是相关权限命令的集合,使用角色的主要目的就是为了简化权限管理。假定有用户a,b,c为了让他们都拥有权限:1)链接数据库(系统权限create session);2)在scott.emp表上select,insert,update。
如果采用直接授权操作,需要进行12次授权,因此可以采用授权角色来来简化操作。角色可以分为预定义和自定义角色两类。
1、预定义角色
预定义角色是指oracle所提供的角色,每种角色都用于执行一些特定的管理任务,下面我们主要介绍常用的预定义角色connect,resource,dba。
(1)connect角色
connect角色具有一般应用开发人员需要的大部分权限,当建立了一个用户后,多数情况下,只要给用户授予connect和resource角色就够了,
那么connect角色具有哪些系统权限呢?alter session /create cluster /create database link/create session/create table/create view/create sequence
(2)resource角色
resource角色具有应用程序开发人员所需要的其他权限,比如建立存储过程、触发器等。这里需要注意的是resource角色隐含了unlimited tablespace系统权限。resource角色包含以下系统权限:create cluster/create indextype/create table/create sequence/create type/create procedure/create trigger
(3)dba角色
dba角色具有所有的系统权限,及with admin option 选项,默认的dba用户为sys和system他们可以将任何系统权限授予其他用户。但是要注意的是dba角色不具备sysdba和sysoper的特权(启动和关闭数据库)

2、自定义角色
根据自己的需要来定义角色,一般是dba来建立,如果用的别的用户来建立,则需要具有create role的系统权限。在建立角色时可以指定验证方式(不验证,数据库验证等)
(1)建立角色(不验证)
如果角色是公用的角色,可以采用不验证的方式建立角色。
create role 角色名 not identified;

(2)建立角色(数据库验证)
采用这样的方式时,角色名、口令存放在数据库中。当激活该角色时,必须提供口令。在建立这种角色时,需要为其提供口令。
create role 角色名 identified by shunping;

(3)角色授权
当建立角色时,角色没有任何权限,为了使得角色完成特定任务,必须为其授权相应的系统权限和对象权限。
给角色授权和给用户授权么有太多的区别,但是要注意系统权限的unlimited tablespace和对象权限的with grant option选项是不能授予角色的。
conn system/Manager@orcl;
grant create session to 角色名 with admin option;//给角色授予create session系统权限
conn scott/liujiyu@orcl;
grant select on emp to 角色名;//将对scott表emp查询的对象权限授予角色
grant insert ,update,delete on emp to 角色名;

(4)角色授权
现在角色我们已经创建成功了,且角色也有了相应的系统和对象权限了,现在就是将角色分配给用户。
一般分配角色给用户是由dba来完成的,如果要以其他用户身份分配角色,则要求用户必须具有grant any role的系统权限。
conn system/Manager @orcl;
grant 角色名 to blake with adimin option;


(5)删除角色
使用drop role 命令,一般是dba来执行,如用其他用户则要求该用户具有drop any role系统权限
conn system/Manager@orcl;
drop role 角色名;
需要注意的是:如果某个角色被删除了,那么被授予该角色的用户时候还具有该角色的权限呢?答案是不具有。


3、显示角色信息
1)显示所有角色
select * from dba_roles;
2)显示角色具有的系统权限
select privilege,admin_option from role_sys_privs where role='角色名';
3) 显示角色具有的对象权限
通过查询数据字典视图dba_tab_privs可以查看角色具有的兑现权限或是列的权限
4)显示用户具有的角色,及默认角色
通过查询数据字典视图dba_role_privs可以显示某个用户具有的所有角色及当前默认的角色
select granted_role,default_role from dba_role_privs where role='角色名';

4、精细访问控制
是指用户可以使用函数、策略实现更加细微的安全访问控制,如果使用精细访问控制,则当在客户端发出sql语句(select ,insert,update,delete)时,oracle会自动在sql语句后面追加谓词(where子句),并执行新的sql语句。通过这样的控制,可以使得不同的数据库用户在访问相同表时,返回不同的数据信息,如图: