2009-08-19 2 views

Antwort

99

Wenn Sie wollen mehr als nur direkte Tabelle Zuschüsse (zB Zuschüsse über Rollen, Systemprivilegien wie jede Tabelle auswählen, etc.), sind hier einige zusätzliche Fragen:

Systemberechtigungen für einen Benutzer:

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; 

Direktzuschüsse für Tabellen/Ansichten:

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; 

Indirekte gewährt Tabellen/Ansichten:

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

Sie haben möglicherweise nicht das Recht, die Tabelle sys.dba_sys_privs anzuzeigen. – Hannes

+1

Absolut korrekt. Sehen Sie Ihren DBA. Wenn sie sich weigern, haben sie möglicherweise berechtigte Sicherheitsbedenken. Wenn Sie den Inhalt dieser Ansichten sehen, erhalten Sie Benutzerinformationen, die sie sonst nicht hätten. – DCookie

+2

Es wäre interessant, links die 'role_role_privs' Tabelle beizutreten und dann' CONNECT BY PRIOR vergeben_role = role' zu ​​rekursieren in transitive Rolle Privilegien ... –

27

Angenommen, Sie gewährt auf alle Objekte ein bestimmter Benutzer zur Liste hat erhalten:

select * from all_tab_privs_recd where grantee = 'your user' 

Dies wird nicht Objekte zurück im Besitz des Benutzers. Wenn Sie diese benötigen, verwenden Sie stattdessen die Ansicht all_tab_privs.

4
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

Einige Erklärung würde diese Antwort helfen, wenn andere Leute kommen und es finden. –

12

Sorry Leute, aber von all_tab_privs_recd Auswahl, wo grantee = 'Ihre Benutzer wird keine Ausgabe außer öffentliche Zuschüsse und aktuellen Nutzer gewährt geben, wenn Sie die Auswahl aus einem anderen ausführen (lassen Sie uns sagen, SYS) Benutzer . Als Dokumentation sagt, beschreibt

ALL_TAB_PRIVS_RECD die folgenden Arten von Zuschüssen:

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

Also, wenn Sie ein DBA sind und alle Objekt Zuschüsse für einen bestimmten (nicht SYS auflisten möchten Benutzer), können Sie diese Systemansicht nicht verwenden.

In diesem Fall müssen Sie eine komplexere Abfrage durchführen. Hier wird man genommen (verfolgt) von TOAD alle Objekt Zuschüsse für einen bestimmten Benutzer zu wählen:

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; 

Diese listet alle Objekt Zuschüsse (einschließlich Spalte Zuschüsse) für Ihre (spezifiziert) Benutzer. Wenn Sie keine Zuweisungen auf Spaltenebene wünschen, löschen Sie den gesamten Teil der Auswahl, der mit der Klausel 'union' beginnt.

UPD: Das Studium der Dokumentation fand ich eine andere Ansicht, dass alle Zuschüsse in viel einfachere Weise aufgeführt:

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

Beachten Sie, dass es keine DBA_TAB_PRIVS_RECD Ansicht in Oracle.

7

Die umfassendste und zuverlässige Methode, die ich weiß, ist nach wie vor von DBMS_METADATA mit:

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; 

Interessante Antworten though.

Verwandte Themen