角色的特点:
可以通过授予和撤消系统权限所用的命令来授予和撤消用户的角色。
可以将角色授予任何用户或角色。但是,不能将角色授予它本身,也不能循环授予(例如:将角色A->B->C->A)。
角色可以由系统权限和对象权限组成(角色也可包含其他角色)。
对于被授予某种角色的每个用户来说,该角色可以启用,也可以禁用。
角色可要求通过口令启用。
在现有的用户名和角色名中,每个角色名必须唯一。
角色不属于任何人。
在数据字典中存储了有关角色的说明。
角色的优点:
轻松权限管理
动态权限管理
可选择权限可用性:
可启用和禁用角色以暂时打开和关闭权限。还可以通过启用角色验证用户是否已被授予该角色。
可以通过操作系统授予
创建角色:
使用CREATE ROLE 语句可创建角色。必须具有CREATE ROLE 系统权限才能创建角色。
创建类型为NOT IDENTIFIED、IDENTIFIED EXTERNALLY 或BY password 的角色时,通过ADMIN 选项为该角色授权。
使用下列命令创建角色:
CREATE ROLE role [NOT IDENTIFIED (缺省) | IDENTIFIED
{BY password | EXTERNALLY | GLOBALLY | USING package}]
其中:
role :是角色的名称
NOT IDENTIFIED :表明启用该角色时,不需要进行验证
IDENTIFIED :表明启用该角色时,需要进行验证
BY password :提供用户在启用角色时必须指定的口令
USING package :创建应用程序角色,该角色只能由使用授权的程序包的应用程序启用
EXTERNALLY :表明在启用该角色之前,用户必须由外部服务(例如操作系统或第三方服务)授权
GLOBALLY :表明通过SET ROLE 语句启用角色之前或登录时,必须由企业目录服务授权用户使用该角色
预定义角色:

图1
修改角色:
修改角色时,只能更改其验证方法。而且,您的角色必须通过ADMIN 选项进行授予,或
者您必须具有ALTER ANY ROLE 系统权限。
使用下列命令修改角色:
ALTER ROLE role {NOT IDENTIFIED | IDENTIFIED
{BY password |USING package| EXTERNALLY | GLOBALLY }};
分配角色:
可使用为用户授予系统权限所用的语法命令为用户授予角色:
GRANT role [, role ]...
TO {user|role|PUBLIC}
[, {user|role|PUBLIC} ]...
[WITH ADMIN OPTION]
其中:
role :是要授予的角色集合
PUBLIC :将角色授予所有用户
WITH ADMIN OPTION :使被授予者能够为其他用户或角色授予角色。(如果使用该选项授予角色,被授予者将能够授予和撤消其他用户的角色,并可改变或删除角色。)缺省情况下,对于创建角色的用户,系统将通过ADMIN OPTION 为其分配角色。没有通过ADMIN OPTION 被授予角色的用户需要具有GRANT ANY ROLE 系统权限才能授予和撤消其它角色。
SQL> select * from dba_role_privs where granted_role='R1';
 
GRANTEE                        GRANTED_ROLE           ADM DEF
------------------------------ ---------------------- --- ---
SYS                            R1                     YES YES
USER1                          R1                     NO YES
# 角色创建后,默认授予sys。
注:用户可启用的数据库角色的最多数目由初始化参数MAX_ENABLED_ROLES 设置。
SQL> show parameter max_enabled
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ----------------
max_enabled_roles                    integer     30
缺省角色:
例:
ALTER USER scott DEFAULT ROLE hr_clerk, oe_clerk;
ALTER USER scott DEFAULT ROLE ALL;
ALTER USER scott DEFAULT ROLE ALL EXCEPT hr_clerk;
ALTER USER scott DEFAULT ROLE NONE;
可以为一个用户分配多个角色。缺省角色是用户登录时自动启用的角色的子集。缺省情况下,登录时自动启用分配给用户的所有角色,而无需口令。使用ALTER USER 命令可以限制用户的缺省角色的数目。
DEFAULT ROLE 子句只适用于已通过GRANT 语句直接授予用户的角色。DEFAULT ROLE子句不能用来启用下列角色:
未授予用户的角色
通过其它角色授予的角色
由外部服务(如操作系统)管理的角色
使用下列语法分配用户的缺省角色:
ALTER USER user DEFAULT ROLE
{role [,role]... | ALL [EXCEPT role [,role]... ] | NONE}
其中:
user :是被授予角色的用户的名称
role :是作为用户缺省角色的角色
ALL :除EXCEPT 子句中列出的角色外,将授予用户的所有角色都设置为缺省角色(这是缺省设置。)
EXCEPT :表明后随角色不应包括在缺省角色中
NONE :授予用户的任何角色都不作为缺省角色(用户登录时拥有的唯一权限是直接分配给该用户的权限。)
由于角色必须被授予后才有可能作为缺省角色,所以不能使用CREATE USER 命令设置缺省角色。
SQL> grant r2 to user1;
 
Grant succeeded.
 
SQL> select * from dba_role_privs where grantee='USER1'; 
 
GRANTEE             GRANTED_ROLE                   ADM DEF
----------------- ------------------------------ --- ---
USER1               R1                             NO YES
USER1              R2                             NO YES
 
SQL> alter user user1 default role r1;
 
User altered.
 
SQL> select * from dba_role_privs where granted_role='R1';
 
GRANTEE             GRANTED_ROLE                   ADM DEF
------------------- ------------------------------ --- ---
SYS                  R1                             YES YES
USER1               R1                             NO YES
 
SQL> conn user1/user1
Connected.
SQL> select * from session_privs;
 
PRIVILEGE
----------------------------------------
CREATE SESSION
 
SQL> select * from session_roles;
 
ROLE
------------------------------
R1
启用和禁用角色
启用或禁用角色可暂时激活和不激活与角色关联的权限。必须首先为用户授予角色,然后才能启用该角色。
启用角色时,用户可以使用授予该角色的权限。如果禁用角色,用户将不能使用与该角色关联的权限,除非将该权限直接授予用户或授予为该用户启用的另一个角色。角色的启用针对的是一个会话。在下一个会话中,用户的活动角色将恢复为缺省角色。
指定要启用的角色:
SET ROLE 命令和DBMS_SESSION.SET_ROLE 过程将启用包含在命令中的全部角色,并禁用所有其它角色。可以通过任何允许使用PL/SQL 命令的工具或程序启用角色;但不能在存储过程中启用角色。
可以使用ALTER USER...DEFAULT ROLE 命令指出用户登录时将启用的角色。所有其它角色都将被禁用。
启用角色时可能需要口令。SET ROLE 命令中必须包含口令才能启用角色。分配给用户的缺省角色不需要口令,这些角色同没有口令的角色一样在登录时启用。
限制:
不能在存储过程中启用角色,因为该操作可能会改变安全域(权限集),安全域允许首先调用存储过程。因此,在PL/SQL 中,可以在匿名块和应用程序过程(如Oracle Forms 过程)中启用和禁用角色,但不能在存储过程中执行该操作。如果存储过程包含了SET ROLE 命令,运行时会产生下列错误:
ORA-06565: cannot execute SET ROLE from within stored procedure
启用和禁用角色
SET ROLE 命令关闭授予用户的任何其它角色(只启用该命令中指定的role)。
SET ROLE {role [ IDENTIFIED BY password ]
[, role [ IDENTIFIED BY password ]]...
| ALL [ EXCEPT role [, role ] ...]
| NONE }
其中:
role :是角色的名称
IDENTIFIED BY password :提供启用角色时所需的口令
ALL :除了EXCEPT 子句中列出的角色外,启用授予当前用户的全部角色(不能使用
该选项启用带口令的角色。)
EXCEPT role :不启用这些角色
NONE :禁用当前会话的全部角色(只有直接授予用户的权限是活动的。)
只有在启用的每个角色都没有口令时,不带EXCEPT 子句的ALL 选项才有效。
SQL> set role r2 ;
set role r2
*
ERROR at line 1:
ORA-01979: missing or invalid password for role 'R2'
 
SQL> set role r2 identified by r2;
 
Role set.
 
SQL> select * from session_privs;
 
PRIVILEGE
----------------------------------------
CREATE TABLE
 
SQL> select * from session_roles;
 
ROLE
------------------------------
R2
 
SQL> set role r2 identified by r2, r1;
 
Role set.
 
SQL> select * from session_privs;
 
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
 
SQL>
SQL> select * from session_roles;
 
ROLE
------------------------------
R2
R1
撤消用户角色
使用SQL 语句REVOKE 可撤消用户角色。通过ADMIN 选项获取角色的任何用户都可撤消任何其他数据库用户或角色的角色。此外,具有GRANT ANY ROLE 权限的用户也可以撤消任何角色。
REVOKE role [, role ]
FROM {user|role|PUBLIC}
[, {user|role|PUBLIC} ]
其中
role :是要撤消的角色或从其撤消角色的角色
user :要撤消其系统权限或角色的用户
PUBLIC :撤消所有用户的权限或角色
SQL> conn /as sysdba
Connected.
SQL> grant r1 to user1 with admin option;
 
Grant succeeded.
 
SQL> select * from dba_role_privs where grantee like(USER%);
 
GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
USER1                          R1                             YES YES
USER1                          R2                             NO NO
USER2                          R2                             NO YES
 
3 rows selected.
 
SQL> conn user1/user1
Connected.
SQL> grant r1 to user2;
 
Grant succeeded.
 
SQL> revoke RESOURCE from luo;
revoke RESOURCE from luo
*
ERROR at line 1:
ORA-01031: insufficient privileges
删除角色
使用下列语法从数据库中删除角色:
DROP ROLE role
删除角色时,Oracle 服务器从所有用户和被授予该角色的角色中及数据库中撤消该角色。
必须通过ADMIN OPTION 被授予了角色或具有DROP ANY ROLE 系统权限才能删除角色。
角色创建原则

图2
因为角色包含执行任务所需的权限,因此,角色名通常就是应用程序任务或职称。图中的示例就使用应用程序任务与职称作为角色名。请按下列步骤创建、分配和授予用户角色:
1. 为每个应用程序任务创建一个角色。应用程序角色名对应于应用程序任务,如PAYROLL。
2. 为应用程序角色分配执行任务所需的权限。
3. 为每种用户类型创建一个角色。用户角色名对应于职称,如PAY_CLERK。
4. 将应用程序角色授予用户角色。
5. 将用户角色授予用户。
如果应用程序的修改要求使用新的权限执行工资表任务,则DBA 只需向应用程序角色PAYROLL 分配新的权限。当前正在执行该任务的所有用户都将接收到新的权限。
使用口令与缺省角色的原则

图3
启用角色时口令提供了额外的安全级。例如,在启用PAY_CLERK 角色时,应用程序可能要求用户输入口令,因为可以使用该角色发出支票。
通过使用口令,只能通过应用程序来启用角色。在图3示例中对这种技术做了说明。
DBA 授予了用户两个角色:PAY_CLERK 和PAY_CLERK_RO。
PAY_CLERK 已被授予执行工资表职员功能所需的全部权限。
PAY_CLERK_RO (RO 表示只读)仅被授予了在表上执行工资表职员功能所需的SELECT 权限。
用户可以登录到SQL* Plus 进行查询,但是不能修改任何数据,这是由于PAY_CLERK 不是一个缺省角色,用户并不知道PAY_CLERK 的口令。
当用户登录到工资表应用程序时,该程序提供口令以启用PAY_CLERK。口令已编入程序中,系统不会提示用户输入口令。
应用程序角色
CREATE ROLE 语句中的USING package 子句用来创建应用程序角色。应用程序角色只
能由使用授权的PL/SQL 程序包的应用程序启用。应用程序开发人员无需在应用程序内嵌
入口令来保护角色。他们可创建应用程序角色并指定授权哪个PL/SQL 程序包可以启用该
角色。
SQL> CREATE ROLE admin_role IDENTIFIED USING hr.employees;
本例中,admin_role 是一个应用程序角色,只有在hr.employee PL/SQL 程序包内定
义的模块才能启用该角色。
 详见:10grelease2联机文档->book->secure->Security Guide->13.4
 获取信息: 
DBA_ROLES :数据库中存在的所有角色
DBA_ROLE_PRIVS :授予用户和角色的角色
ROLE_ROLE_PRIVS :授予角色的角色
DBA_SYS_PRIVS :授予用户和角色的系统权限
ROLE_SYS_PRIVS :授予角色的系统权限
ROLE_TAB_PRIVS :授予角色的对象权限
SESSION_ROLES :用户当前启用的角色