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

gue*_*rda 90 sql oracle grant

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

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

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

DCo*_*kie 128

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

用户的系统权限:

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;
Run Code Online (Sandbox Code Playgroud)

直接授予表/视图:

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;
Run Code Online (Sandbox Code Playgroud)

间接授予表/视图:

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;
Run Code Online (Sandbox Code Playgroud)

  • 离开加入`role_role_privs`表然后`CONNECT BY PRIOR granted_role = role`来加入传递角色权限会很有趣...... (2认同)

Jur*_*ris 31

假设您要列出特定用户收到的所有对象的授权:

select * from all_tab_privs_recd where grantee = 'your user'
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*kas 17

很抱歉,但是从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
Run Code Online (Sandbox Code Playgroud)

因此,如果您是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;
Run Code Online (Sandbox Code Playgroud)

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

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

select * from DBA_TAB_PRIVS where grantee = 'your user';
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*ini 12

我所知道的最全面,最可靠的方法仍然是使用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;
Run Code Online (Sandbox Code Playgroud)

虽然有趣的答案.


小智 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')
;
Run Code Online (Sandbox Code Playgroud)

  • 某些解释将有助于此答案,因为其他人来时会找到它。 (6认同)