日期:2014-05-16  浏览次数:20406 次

Oracle 用户、角色权限管理上的几个误区

如果你想查看数据库中哪些用户具有修改SCOTT.DEPT表的权限,你会怎么查?

      答:select * from dba_tab_privs where OWNER='SCOTT' and TABLE_NAME='DEPT';

      这个语句结果是错误的.......如果角色A,有修改此表的权限,所有具有角色A的用户都被漏掉了。

如果你想查看哪些用户具有DBA权限,你会怎么查?你确定查询结果是正确的?

      答:select grantee,granted_role from dba_role_privs where granted_role='DBA';

      这个语句结果是错误的......,具体在第三部分测试。

如果你将CONNECT、RESOURCE角色授予某个用户,同时授予SELECT ON SCOTT.DEPT的权限,该如何查看这个用户拥有的权限明细?

      答:不好查。

如何对比两个用户的表级权限有无差异?

       答:select * from dba_tab_privs where grantee='A' ;  select * from dba_tab_privs where grantee='B' ;一看就出来了。

       这个语句结果是错误的,如果将角色C授予A,角色D授予B。dba_tab_privs中都不会有记录。如果角色C、D权限不一致,问题就出来了。

 

看完本文,你就明白为什么了。呵,相信本文可以让您对Oracle的权限管理更加得心应手。

 

一、通用查询

Oracle目前没有提供查看某个用户所有角色或所有权限的视图。要查看这类信息,一般通过如下SQL语句:

SQL> select count(*) from session_privs;
 
  COUNT(*)
----------
       202
 
SQL> select count(*) from session_roles;
 
  COUNT(*)
----------
        20
 
SQL> 


这两个视图,只能查看当前连接用户拥有的权限和角色。

DBA如果需要查看其它用户的权限、角色,必须切换用户登入,再执行上述SQL。

 

二、推荐的查询实例

因近期工作需要,整理了下用户、角色信息的查看语句,在这里分享下:

1、查看数据库里所有用户各自拥有的角色:

SQL> select * from (select distinct connect_by_root grantee username,granted_role
    from dba_role_privs
    connect by prior granted_role =grantee ) a
    where exists (select 1 from dba_users b where b.username=a.username)
    order by 1,2
    ;
 
USERNAME                       GRANTED_ROLE
------------------------------ ------------------------------
......(省略部分)
FLOWS_030000                   CONNECT
FLOWS_030000                   HS_ADMIN_ROLE
FLOWS_030000                   RESOURCE
FLOWS_030000                   SELECT_CATALOG_ROLE
SCOTT                          CONNECT
SCOTT                          RESOURCE
TEST                           DATAPUMP_EXP_FULL_DATABASE
TEST                           DATAPUMP_IMP_FULL_DATABASE
TEST                           DBA
TEST                           DELETE_CATALOG_ROLE
TEST                           EXECUTE_CATALOG_ROLE
TEST                           EXP_FULL_DATABASE
TEST                           GATHER_SYSTEM_STATISTICS
TEST                           HS_ADMIN_ROLE
TEST                           IMP_FULL_DATABASE
TEST                           JAVA_ADMIN
TEST                           JAVA_DEPLOY
TEST                           OLAP_DBA
TEST                           OLAP_XS_ADMIN
TEST                           SCHEDULER_ADMIN
TEST                           SELECT_CATALOG_ROLE
TEST                           WM_ADMIN_ROLE
TEST                           XDBADMIN
TEST                           XDB_SET_INVOKER
......省略部分
SQL> 


2、查看数据库所有用户的系统权限:

SQL> select d.username,d.privilege from
     (select a.username,b.privilege from
       (select distinct connect_by_root grantee username,granted_role
         from dba_role_privs
          connect by prior granted_role =grantee) a,
       (select grantee,privilege from dba_sys_privs) b
       where a.granted_role=b.grantee
     union
      select grantee,privilege from dba_sys_privs) d
     where exists((select 1 from dba_users c where d.username=c.username))
     order by 1,2;
 
USERNAME                       PRIVILEGE
------------------------------ ----------------------------------------
......省略部分
FLOWS_0