一、索引简介:
索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低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工具查看索引信息:
方法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
授权成功。
//如何回收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>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)用户scott将select、update、delete赋予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 session、select、update、delete权限!
(二) 分配角色给用户:
范例:用户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的权限不存在!
转载于:https://blog.51cto.com/beyondhdf/1324728