代码之家  ›  专栏  ›  技术社区  ›  guerda

如何列出用户收到的所有授权?

  •  84
  • guerda  · 技术社区  · 16 年前

    我需要查看Oracle数据库的所有授权。

    我使用toad特性来比较模式,但它没有显示出诱人的赠款等,所以我的问题是:

    如何列出Oracle数据库上的所有授权?

    5 回复  |  直到 9 年前
        1
  •  120
  •   DCookie    16 年前

    如果您需要的不仅仅是直接表授予(例如,通过角色授予、系统特权(如选择任何表等),以下是一些附加查询:

    用户的系统权限:

    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;
    
        2
  •  30
  •   Juris    16 年前

    假设你想列出所有 物体 特定用户具有 收到 :

    select * from all_tab_privs_recd where grantee = 'your user'
    

    这不会返回用户拥有的对象。如果您需要这些,请使用 all_tab_privs 相反的观点。

        3
  •  15
  •   Alex Cherkas    12 年前

    抱歉,伙计们,但是从所有的特权中选择grantee='your user'将不会提供任何输出,除了公共授权和当前用户授权,如果您从不同的(比如,sys)用户运行select。如文件所述,

    “所有”选项卡描述了以下类型的赠款:

    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”子句开头的select的所有部分。

    upd:研究文档后,我发现了另一个视图,它以更简单的方式列出了所有赠款:

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

    记住有 Oracle中的dba_选项卡_privs_recd视图。

        4
  •  11
  •   Matteo Steccolini    9 年前

    我所知道的最全面和最可靠的方法仍然是 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;
    

    不过,有趣的答案。

        5
  •  4
  •   Sujit    13 年前
    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')
    ;