按部就班学Oracle之索引、权限、角色

1、索引简介:数据库

索引是用于加速数据存取的数据对象,合理的使用索引能够大大下降I/O次数,从而提升数据访问性能。索引有不少种主要介绍经常使用的几种:windows

1-单列索引:session

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

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

范例1:建立单列索引函数

SQL> create indexnameIndexon customer(name);工具

Index created性能

2-复合索引:spa

复合索引是基于两列或多列的索引。在同一张表上能够有多个索引,可是要求列的组合必须不一样。命令行

范例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


2、权限简介:

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>

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

3、角色简介:

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

角色分为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的权限存在

相关文章
相关标签/搜索