一、权限
1、权限:执行特定类型sql命令或是访问其它方案对象的权利,包括系统权限和对象权限两种。
2、系统权限
1)系统权限:执行特定类型sql命令的权利,用于控制用户可以执行的一个或是一组数据库操作。
- 当用户具有create table权限时,可以在其它方案中建表。
- 当用户具有create any table权限时,可以在任何方案中建表。
- oracle提供了两百多种系统权限。
2)常用权限
- create session:连接数据库
- create table:建表
- create view:建视图
- create public synonym:建同义词
- crete procedure:建过程、函数、包
- create trigger:见触发器
- create claster:建簇
3)显示系统权限:oracle的版本越高,提供的系统权限就越多。可以查询数据字典视图system_privilege_map来显示所有系统权限。
- select * from system_privilege_map order by name;
4)授予系统权限:
(1)一般情况,授予系统权限是由dba完成的。如果用其他用户来授予系统权限,则要求该用户必须具有grant any privilege的系统权限。在授予系统权限是,可以带有with admin option选项。这样,被授予权限的用户或角色还可以将该系统权限授予其它用户或角色。
(2)示例
- 创建两个用户ken,tom。初始阶段他们咩有任何权限,如果登录就会给出错误信息。
-
- create user ken identified by ken;
- 给用户ken授权
-
- grant create session,create table to ken with admin option;
- grant create view to ken;
- 给用户tom授权
-
- grant create session,create table to tom;
- grant create view to tom;(False)
5)回收系统权限
(1)一般情况,回收系统权限是由dba完成的。如果用其他用户来回收系统权限,要求该用户必须具有相应系统权限及转授系统权限的选项(with admin option)。
(2)回收系统权限使用revoke来完成。
(3)系统权限不是级联回收。
(4)示例:
system(create session)——>ken(create session)——>tom(create session)
- revoke create session from ken;(注意:此时,tom还可以登录)
3、对象权限
1)对象权限:访问其他方案对象的权利。用户可以直接访问自己方案的对象。但是,如果要访问其它方案的对象,则必须具有对象的权限。
2)常用的对象权限:
- alter:修改
- delete:删除
- select:查询
- insert:添加
- update:修改
- index:索引
- references:引用
- execute:执行
3)显示对象权限:查询数据字典视图dba_tab_privs来显示用户或角色所具有的对象权限。
- select distinct privilege from dba_tab_privs;
- select grantor,owner,table_name,privilege from dba_tab_privs where grantee='BLAKE';
4)授予对象权限
(1)在oracle9i之前,授予对象权限是由对象的所有者来完成的,如果用其他用户来操作,则需要对象具有相应的权限(with grant option)。从oracle9i开始,dba用户(sys,system)可以将任何对象上的对象权限授予其它用户。
- 授予对象权限用命令grant来完成。
(2)对象权限可以授予用户、角色和public。
- 在授予权限时,如果带有with grant option选项,则可以将该权限转手给其它用户。但是,with grant option选项不能被授予角色。
(3)示例:monkey用户要操作scott.emp表,则必须授予相应的对象权限。
- 希望monkey可以查询scott.emp的表数据
-
- SQL> grant select on emp to monkey;
- 希望monkey可以修改scott.emp的表数据
-
- SQL> grant update on emp to monkey;
- 希望monkey可以删除scott.emp的表数据
-
- SQL> grant delete on emp to monkey;
- 一次把所有权限付给monkey
-
- SQL> grant all on emp to monkey;
(4)示例:能否对monkey访问权限更加精细控制
- 希望monkey只可以修改scott.emp表的sal字段
-
- SQL> grant update on emp(sal) to monkey;
- 希望monkey只可以查询scott.emp表的ename,sal字段
-
- SQL> grant select on emp(ename,sal) to monkey;
(5)授予alter权限:如果black用户要修改scott.emp的表结构,则必须授予alter对象权限。
- SQL> conn scott/***;
- SQL> grant altert on emp to blake;
(6)授予execute权限:如果用户想要执行其他方案的包、过程、函数等,则必须拥有execute权限。
- 使ken可以执行包dbms_transaction,可以授予execute权限。
-
- SQL> conn system/***;
- SQL> grant execute on dbms_transaction to ken;
(7)授予index权限:如果想在别的方案的表上建立索引,则必须授予index对象权限。
- SQL> conn scott/***;
- SQL> grant index on scott.emp to blake;
(8)使用with grant option选项:用于转授予对象权限,但是该选项只能被授予用户,而不能授予角色。
- SQL> conn scott/***;
- SQL> grant select on emp to blake with grant option;
- SQL> conn blake/***;
- SQL> grant select on scott.emp to jones;
5)回收对象权限
(1)在oracle9i中,收回对象的权限可以由对象的所有者来完成,也可以用dba用户(sys,system)来完成。
(2)收回对象权限后,用户就不能执行相应的sql命令。
(3)系统权限不是级联回收。
(4)示例:
scott(select on emp)——>blake(select on emp )——>jones(select on emp )
- revoke select on emp from ken;(注意:此时,tom不可以登录)
二、角色
1、角色:相关权限的命令集合。
2、角色的目的:简化权限的管理。
3、角色分为:预定义角色和自定义角色两类。
4、预定义角色:oracle所提供的角色,每种角色都用于执行一些特定的管理任务。
1)connect角色:具有一般应用开发人员需要的大部分权限。当建立了一个用户有,多数情况下,只要给用户授予connect和resource角色就够了。
- alter session
- create cluster
- create database link
- create session
- create table
- create view
- create sequence
2)resource角色:具有一般应用开发人员需要的大部分权限,比如建立存储过程、触发器等。注意:resource角色隐含了unlimited tablespace系统权限。
- create cluster
- create indextype
- create table
- create sequence
- create type
- create procedure
- create trigger
3)dba角色:具有所有的系统权限,及with admin option选项。默认的dba用户为sys和system,可以将任何系统权限授予其它用户。注意:dba角色不具备sysdba和sysoper的特权(启动和关闭数据库)。
5、自定义角色:根据自己的需要来定义。一般是dba来建立;如果用别的用户来建立,则需要具有create role的系统权限。在建立角色是可以指定验证方式(不验证、数据库验证等)
1)建立角色(不验证):如果角色时共用的,可以采用不验证的方式建立角色。
- create role 角色名 not identified;
2)建立角色(数据库验证):角色名和口令存放在数据库中。当激活该角色时,必须提供口令。在建立角色时,需要为其提供口令。
- create role 角色名 identified by ***;
6、角色授权:当建立角色时,角色没有任何权限。
1)给角色授权:与给用户授权区别不大。
- 注意:系统权限的unlimited tablespace和对象权限的with grant option选项是不能授予角色的。
- SQL> conn system/***;
- SQL> grant create session to 角色名 with admin option;
- SQL> conn scott/***;
- SQL> grant select on scott.emp to 角色名;
- SQL> grant insert,update,delete on scott.emp to 角色名;
2)分配角色给某个用户:一般分配角色是由dba来完成的。如果要以其它用户身份分配角色,则要求用户必须具有grant any role的系统权限。
- SQL> conn system/***;
- SQL> grant 角色名 to blake with admin option;
7、删除角色:使用drop role,一般要求由dba或具有drop any role系统权限的用户来完成。
- SQL> conn system/***;
- SQL> drop role 角色名;
- 如果角色被删除,那么
8、显示角色信息
1)显示所有角色
- SQL>select * from dba_roles;
2)显示角色具有的系统权限
- SQL>select privilege,admin_option from role_sys_privs where role='角色名';
3)显示角色具有的对象权限
- 通过查询数据字典视图dba_tab_privs可以查看角色具有的对象权限或是列的权限。
4)显示用户具有的角色及默认角色
- 当以用户的身份连接到数据库时,oracle会自动激活默认的角色,通过查询数据字典视图dba_role_privs可以显示某个用户具有的所有角色及当前默认的角色。
- SQL>select granted_role,default_role from dba_role_privs where grantee='用户名';
9、精细访问控制:指用户可以使用函数、策略是先更加细微的安全访问控制。
- 如果使用精细访问控制,则当在客户端发出sqL语句(select, insert, update, delete)时,oraacle会自动在sql语句后追加谓词(where子句),并执行新的sql语句。通过这样的控制,可以使得不同的数据库用户在访问相同表时,返回不同的数据信息。如下:
- 如上所示,通过策略emp_access,用户scott,blake,jones在执行相同的sql语句是,可以返回不同的结果。例如,当执行select ename from emp;时,根据实际情况可以返回不同的结果。