如何列出用户收到的所有拨款?

时间:2009-08-19 08:18:50

标签: sql oracle grant

我需要查看Oracle DB上的所有授权。

我使用TOAD功能来比较模式,但它没有显示临时授权等等所以我的问题是:

如何列出Oracle DB上的所有授权?

6 个答案:

答案 0 :(得分:122)

如果您不仅需要直接表格授权(例如,通过角色授予,系统特权,例如选择任何表格等),这里还有一些其他查询:

用户的系统权限:

SELECT PRIVILEGE
  FROM sys.dba_sys_privs
 WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE 
  FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
 WHERE rp.grantee = <theUser>
 ORDER BY 1;

直接授予表/视图:

SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv 
  FROM table_privileges
 WHERE grantee = <theUser>
 ORDER BY owner, table_name;

间接授予表/视图:

SELECT DISTINCT owner, table_name, PRIVILEGE 
  FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
 WHERE rp.grantee = <theUser>
 ORDER BY owner, table_name;

答案 1 :(得分:30)

假设您要在所有对象上列出授权,则特定用户已收到

select * from all_tab_privs_recd where grantee = 'your user'

这不会返回用户拥有的对象。如果您需要,请改用all_tab_privs视图。

答案 2 :(得分:16)

很抱歉,但是从all_tab_privs_recd中选择grantee ='您的用户',除了公共拨款和当前用户授权外,如果您从其他(我们说,SYS)用户运行select,则不会提供任何输出。正如文档所说,

  

ALL_TAB_PRIVS_RECD描述了以下类型的拨款:

Object grants for which the current user is the grantee
Object grants for which an enabled role or PUBLIC is the grantee

因此,如果您是DBA并希望列出特定(非SYS本身)用户的所有对象授权,则无法使用该系统视图。

在这种情况下,您必须执行更复杂的查询。以下是TOAD中的一个(跟踪)选择特定用户的所有对象授权:

select tpm.name privilege,
       decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
       ue.name grantee,
       ur.name grantor,
       u.name owner,
       decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                       4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                       7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                       11, 'PACKAGE BODY', 12, 'TRIGGER',
                       13, 'TYPE', 14, 'TYPE BODY',
                       19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
                       22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
                       28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
                       32, 'INDEXTYPE', 33, 'OPERATOR',
                       34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
                       40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
                       42, 'MATERIALIZED VIEW',
                       43, 'DIMENSION',
                       44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
                       66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
                       48, 'CONSUMER GROUP',
                       51, 'SUBSCRIPTION', 52, 'LOCATION',
                       55, 'XML SCHEMA', 56, 'JAVA DATA',
                       57, 'EDITION', 59, 'RULE',
                       62, 'EVALUATION CONTEXT',
                       'UNDEFINED') object_type,
       o.name object_name,
       '' column_name
        from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
             table_privilege_map tpm
        where oa.obj# = o.obj#
          and oa.grantor# = ur.user#
          and oa.grantee# = ue.user#
          and oa.col# is null
          and oa.privilege# = tpm.privilege
          and u.user# = o.owner#
          and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
  and ue.name = 'your user'
  and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
       decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
       ue.name grantee,
       ur.name grantor,
       u.name owner,
       decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
       o.name object_name,
       c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
     sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
  and oa.grantor# = ur.user#
  and oa.grantee# = ue.user#
  and oa.obj# = c.obj#
  and oa.col# = c.col#
  and bitand(c.property, 32) = 0 /* not hidden column */
  and oa.col# is not null
  and oa.privilege# = tpm.privilege
  and u.user# = o.owner#
  and o.TYPE# in (2, 4, 42)
  and ue.name = 'your user'
  and bitand (o.flags, 128) = 0;

这将列出(指定)用户的所有对象授权(包括列授权)。如果您不想要列级别授权,则删除以“union”子句开头的选择的所有部分。

UPD:研究文档我发现了另一种视图,它以更简单的方式列出了所有授权:

select * from DBA_TAB_PRIVS where grantee = 'your user';

请记住,Oracle中有没有 DBA_TAB_PRIVS_RECD视图。

答案 3 :(得分:11)

我所知道的最全面,最可靠的方法仍然是使用DBMS_METADATA

select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;

虽然有趣的答案。

答案 4 :(得分:5)

select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP 
on (RP.GRANTED_ROLE = RTP.role)  
where (OWNER in ('YOUR USER') --Change User Name
   OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;

答案 5 :(得分:0)

以下查询可用于获取一个用户的所有特权。只需在第一个查询中提供用户名,即可获得该用户的所有特权

有AS个用户 (从双重选择“ SCHEMA_USER” usr), 角色AS (选择grant_role 从dba_role_privs rp 加入用户 在rp.GRANTEE = users.usr 联盟 SELECT grant_role 从role_role_privs 角色在哪里(SELECT grant_role 从dba_role_privs rp 加入用户 在rp.GRANTEE = users.usr)) tab_privilage AS (SELECT OWNER,TABLE_NAME,PRIVILEGE FROM role_tab_privs rtp 加入角色 开启rtp.role = r.granted_role 联盟 SELECT OWNER,TABLE_NAME,PRIVILEGE 从Dba_Tab_Privs dtp 加入用户 在dtp.grantee = users.usr上), sys_privileges AS (选择权限 从dba_sys_privs dsp 加入用户 开启dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY所有者,表名 --SELECT * FROM sys_privileges