Oracle 本身的数据字典设计我个人觉得很合理, 因为

DBA_xxx, ALL_xxx,USER_xxx 让人一看大概就知道

这个视图是干什么用的. 本文简要总结了一下与

权限,角色相关的视图.

一. 概述

   与权限,角色相关的视图大概有下面这些:

       DBA_SYS_PRIVS: 查询某个用户所拥有的系统权限

      USER_SYS_PRIVS:   当前用户所拥有的系统权限

      SESSION_PRIVS:     当前用户所拥有的全部权限

      ROLE_SYS_PRIVS:     某个角色所拥有的系统权限

       注意: 要以SYS用户登陆查询这个视图,否则返回空.

      ROLE_ROLE_PRIVS:    当前角色被赋予的角色

      SESSION_ROLES:      当前用户被激活的角色

      USER_ROLE_PRIVS:   当前用户被授予的角色

      另外还有针对表的访问权限的视图:

TABLE_PRIVILEGES
        ALL_TAB_PRIVS   
       ROLE_TAB_PRIVS:     某个角色被赋予的相关表的权限
       ...

二. Examples

   1. 查询当前用户所拥有的权限

Select * from session_privs;

   2.   查询某个用户被赋予的系统权限.
            可以有多种方式

               

Select * from user_sys_privs;
           或者: select * from DBA_SYS_PRIVS where grantee='XXX'

                 (需要当前用户拥有DBA角色)

    3. 查询当前用户被授予的角色:
            1. Select * from SESSION_ROLES order by ROLE  

            说明: 这个查询会返回当前用户所被授予的全部角色, 其中包括

            嵌套授权的角色. 例如将DBA角色授予了一个用户,DBA角色

            已经被授予的角色(例如 exp_full_database 和 imp_full_database)

             也会被查询出来            

           

            2. Select * from USER_ROLE_PRIVS       

     4. 查询某一角色被赋予的系统权限
    

Select Privilege from ROLE_SYS_PRIVS where ROLE=&Role

        输入 role='CONNECT'

         输出:

PRIVILEGE
           --------------------
          ALTER SESSION
            CREATE CLUSTER
            CREATE DATABASE LINK
            CREATE SEQUENCE
            CREATE SESSION
            CREATE SYNONYM
            CREATE TABLE
            CREATE VIEW

     5. 查询当前角色被授予的角色
      

Select GRANTED_ROLE from ROLE_ROLE_PRIVS where ROLE=&ROLE

         输入 role= 'DBA'

          输出:

GRANTED_ROLE
           ----------------------
          DELETE_CATALOG_ROLE
            EXECUTE_CATALOG_ROLE
            EXP_FULL_DATABASE
            IMP_FULL_DATABASE
            PLUSTRACE
            SELECT_CATALOG_ROLE

        说明: PLUSTRACE这个角色是用于执行SQL AUTO TRACE的, 通过执行

               $ORACLE_HOME/sqlplus/admin/plustrce.sql可以生成这个角色.

********************************************************

当创建一个角色,为其GRANT权限时,加上了WITH ADMIN OPTION

那么拥有此权限的用户便可以GRANT相应的权限给其他用户

而不能GRANT角色给其他用户,如果想要GRANT角色给其他用户

必须在GRANT role_name TO user_name时,加上WITH ADMIN OPTION

(即: GRANT role_name TO user_name WITH ADMIN OPTION)



角色是一组指定的权限,这些权限是系统权限、对象权限或者两者的结合,用于帮助简化权限的管理。不同于单独将系统权限或对象权限授予每个用户,可以将一组系统权限或对象权限授予一个角色,然后将该角色授予用户。这将大量减少维护用户的权限所需的管理开销。图9-6显示了角色如何减少在将角色用于分组权限时需要执行的grant命令(最终是revoke命令)的数量。

图9-6 使用角色管理权限

如果需要改变由角色授权给一组人的权限,则只需要改变该角色的权限,并且该角色的用户有能力自动使用改动后的新权限。用户可以有选择地启用角色,有些角色可以在登录时自动启用。此外,可以使用密码保护角色,添加对数据库中该功能的另一种验证级别。

在表9-11中是数据库自动提供的最常见的角色,其中也简要描述了每个角色中的权限。


DBA

所有具有WITH ADMIN OPTION的系统权限。允许具有DBA角色的人将系统权限授予其他人

DELETE_CATALOG_ROLE

没有任何系统权限,而只有SYS.AUD$和FGA_LOG$上的对象权限(DELETE)。换句话说,该角色允许用户从用于常规或细粒度审计的审计跟踪中删除审计记录

EXECUTE_CATALOG_ROLE

各种系统程序包、过程和函数上的执行权限,例如DBMS_FGA和DBMS_RLS

SELECT_CATALOG_ROLE

1 638个数据字典表上的SELECT对象权限

EXP_FULL_DATABASE

EXECUTE_CATALOG_ROLE、SELECT_CATALOG_ROLE、以及诸如BACKUP ANY TABLE和RESUMABLE等系统权限。允许具有该角色的用户导出数据库中的所有对象

IMP_FULL_DATABASE

类似于EXP_FULL_DATABASE,但是具有多很多的系统权限,例如CREATE ANY TABLE,用于允许导入前面导出的完整数据库

AQ_USER_ROLE

Advanced Queuing所需例程的执行访问,例如DBMS_AQ

AQ_ADMINISTRATOR_ROLE

Advanced Queuing查询的管理程序

SNMPAGENT

由Enterprise Manager Intelligent Agent使用

RECOVERY_CATALOG_OWNER

用于创建一个用户,该用户拥有用于RMAN备份和恢复的恢复目录

HS_ADMIN_ROLE

提供对表HS_*和程序包DBMS_HS的访问,用于管理Oracle Heterogeneous Services

SCHEDULER_ADMIN

提供对程序包DBMS_SCHEDULER的访问,以及用于创建批处理作业的权限


提供角色CONNECT、RESOURCE和DBA主要是为了兼容以前的Oracle版本,而在将来的Oracle版本中可能不会有这些角色。数据库管理员应该使用授权给这些角色的权限作为起点来创建自定义的角色。

1. 创建或删除角色

为了创建角色,可以使用create role命令,并且必须具有CREATE ROLE系统权限。一般来说,该系统权限只授权给数据库管理员或应用程序管理员。下面是示例:

SQL> create role hr_admin not identified;
Role created.

 

默认情况下,启用或使用已分配的角色不需要任何密码或验证。因此,not identified子句是可选项。

和创建用户一样,可以通过密码(使用identified by password的数据库授权)、通过操作系统(identified externally)或者通过网络或目录服务(identified globally)授权使用角色。

除了这些熟悉的方法,还可以通过使用程序包授权角色:这称为使用“安全应用程序角色”。这种类型的角色使用程序包中的过程来启用角色。一般来说,只在某些条件下启用这种角色:用户正在通过Web接口或某个IP地址连接,或者是一天的某个时间。下面是使用过程启用的角色:

SQL> create role hr_clerk identified using hr.clerk_verif;
Role created.

创建角色时,过程HR.CLERK_VERIF不需要存在。然而,当授予该角色的用户需要启用它时,它必须经过编译并且有效。一般来说,使用安全应用程序角色时,默认情况下不针对用户启用该角色。为了指定在默认情况下启用除了安全应用程序角色之外的所有角色,可以使用如下的命令:

SQL> alter user kshelton default role all except hr_clerk;
User altered.

通过这种方式,当HR应用程序启动时,它可以启用角色,其方法是执行set role hr_clerk命令,从而调用过程HR.CLERK_VERIF。用户不需要知道角色或启用角色的过程,因此,对象的访问和角色提供的权限都不可用于应用程序外部的用户。

删除角色和创建角色一样简单:

SQL> drop role keypunch_operator;
Role dropped.

 

下一次连接到数据库时,赋予该角色的任何用户将丢失赋予该角色的权限。如果他们当前已经登录,他们将保留这些权限,直到断开与数据库的连接。

2. 将权限授予角色

将权限赋予角色非常简单,可以使用grant命令将权限赋予角色,如同将权限赋予用户一样:

SQL> grant select on hr.employees to hr_clerk;
Grant succeeded.
SQL> grant create table to hr_clerk;
Grant succeeded.

 

 

 

在该示例中,将对象权限和系统权限赋予HR_CLERK角色。在图9-7中,可以使用基于Web的OEM来将更多的对象权限或系统权限添加给该角色。

图9-7 使用OEM将权限赋予角色

3. 分配或取消角色

一旦已经将所需的对象权限和系统权限赋予角色,就可以使用如下熟悉的语法将角色赋予用户:

SQL> grant hr_clerk to smavris;
Grant succeeded.

SMAVRIS可以自动使用未来授予HR_CLERK角色的其他任何权限,因为SMAVRIS已经被授予该角色。

角色可以授予其他角色,这就允许DBA设计多层次的角色,从而使角色管理更为容易。例如,可能已经具有名为DEPT30、DEPT50和DEPT100的角色,每个角色具有一些对象权限,分别对应各个部门的表。部门30中的雇员将分配DEPT30角色,依此类推。公司的董事长希望看到所有部门中的表,不必将单个的对象权限赋予角色ALL_DEPTS,而是可以将单个的部门角色赋予ALL_DEPTS:

SQL> create role all_depts;
Role created.
SQL> grant dept30, dept50, dept100 to all_depts;
Grant succeeded.
SQL> grant all_depts to sking;
Grant succeeded.

 

 

角色ALL_DEPTS可能也包含单个对象权限和系统权限,这些权限不适用于单个部门,例如订单条目表或账户应收款项表上的对象权限。

从用户处取消角色非常类似于从用户处取消权限:

SQL> revoke all_depts from sking;
Revoke succeeded.

下次用户连接到数据库时,这些取消的权限将不再可用于这些用户。然而,值得注意的是,如果另一个角色包含与删除角色相同对象上的权限,或者直接授予对象上的权限,则用户将保留对象上的这些权限,直到显式地取消这些授权和所有其他授权。

4. 默认的角色

默认情况下,当用户连接到数据库时启用授予该用户的所有角色。如果角色将只用于应用程序的上下文中,则在用户登录时可以先禁用该角色,然后在应用程序中启用和禁用该角色。如果用户SCOTT具有CONNECT、RESOURCE、HR_CLERK和DEPT30角色,希望指定HR_CLERK和DEPT30默认情况下不启用,则可以使用类似于如下的代码:

SQL> alter user scott default role all
2>     except hr_clerk, dept30;
User altered.

 

 

当SCOTT连接到数据库时,他自动具有除HR_CLERK和DEPT30外的所有角色授予的所有权限。通过使用set role,SCOTT可以在他的会话中显式地启用一个角色:

SQL> set role dept30;
Role set.

当完成对部门30的表的访问时,可以在会话中禁用该角色:

SQL> set role all except dept30;
Role set.

注意:

在Oracle 10g中不赞成使用初始参数MAX_ENABLED_ROLES。保留该参数只是为了和以前的版本兼容。

5. 启用密码的角色

为了增强数据库中的安全性,DBA可以为角色赋予密码。在创建角色时为其赋予密码:

SQL> create role dept99 identified by d99secretpw;
Role created.
SQL> grant dept99 to scott;
Grant succeeded.
SQL> alter user scott default role all except hr_clerk, dept30, dept99;
User altered.

 

当用户SCOTT连接到数据库时,他正在使用的应用程序将提供密码或提示用户输入密码,或者他可以在启用角色时输入密码:

SQL> set role dept99 identified by d99secretpw;
Role set.