Wie kann ich ALLE Stipendien auflisten, die ein Benutzer erhalten hat?

97

Ich muss alle Zuschüsse für eine Oracle-Datenbank anzeigen.

Ich habe die TOAD-Funktion verwendet, um Schemas zu vergleichen, aber es werden keine verlockenden Zuschüsse usw. angezeigt. Daher gibt es meine Frage:

Wie kann ich alle Zuschüsse in einer Oracle-Datenbank auflisten?

Guerda
quelle

Antworten:

141

Wenn Sie mehr als nur direkte Tabellenzuweisungen wünschen (z. B. Zuweisungen über Rollen, Systemberechtigungen wie das Auswählen einer beliebigen Tabelle usw.), finden Sie hier einige zusätzliche Abfragen:

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;

Direkte Zuwendungen 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 Zuschüsse für 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;
DCookie
quelle
1
Möglicherweise haben Sie 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 anzeigen, erhalten Sie Benutzerinformationen, die Sie sonst nicht hätten.
DCookie
2
Es wäre interessant, am role_role_privsTisch CONNECT BY PRIOR granted_role = rolezu bleiben und dann in transitive Rollenprivilegien zurückzukehren ...
Lukas Eder
33

Angenommen , Sie möchten Liste gewährt auf alle Objekte ein bestimmter Benutzer hat empfangen :

select * from all_tab_privs_recd where grantee = 'your user'

Dies gibt keine Objekte zurück, die dem Benutzer gehören. Wenn Sie diese benötigen, verwenden Sie all_tab_privsstattdessen die Ansicht.

Juris
quelle
20

Sorry Leute, aber wenn Sie aus all_tab_privs_recd auswählen, wobei grantee = 'Ihr Benutzer' keine Ausgabe außer öffentlichen Zuschüssen und aktuellen Benutzerzuschüssen liefert, wenn Sie die Auswahl von einem anderen Benutzer (z. B. SYS) ausführen. Wie die Dokumentation sagt,

ALL_TAB_PRIVS_RECD beschreibt 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

Wenn Sie also ein DBA sind und alle Objektgewährungen für einen bestimmten Benutzer (nicht SYS selbst) auflisten möchten , können Sie diese Systemansicht nicht verwenden.

In diesem Fall müssen Sie eine komplexere Abfrage durchführen. Hier ist eine von TOAD entnommene (verfolgte), um alle Objektgewährungen für einen bestimmten Benutzer auszuwä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;

Dadurch werden alle Objektgewährung (einschließlich Spaltengewährung) für Ihren (angegebenen) Benutzer aufgelistet. Wenn Sie keine Zuschüsse auf Spaltenebene wünschen, löschen Sie alle Teile der Auswahl, beginnend mit der Klausel 'union'.

UPD: Beim Studium der Dokumentation habe ich eine andere Ansicht gefunden, in der alle Zuschüsse viel einfacher aufgelistet sind:

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

Beachten Sie, dass es in Oracle keine DBA_TAB_PRIVS_RECD-Ansicht gibt.

Alex Cherkas
quelle
12

Die umfassendste und zuverlässigste Methode, die ich kenne, ist immer noch die Verwendung von 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;

Interessante Antworten.

Matteo Steccolini
quelle
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')
;
Sujit
quelle
7
Eine Erklärung würde dieser Antwort helfen, wenn andere Leute kommen und sie finden.
Andrew Barber
0

Die folgende Abfrage kann verwendet werden, um alle Berechtigungen eines Benutzers abzurufen. Geben Sie einfach den Benutzernamen in der ersten Abfrage an, und Sie erhalten alle Berechtigungen dafür

MIT Benutzern AS (SELECT 'SCHEMA_USER' usr FROM dual), Rollen AS (SELECT gewährt_Rolle FROM dba_role_privs rp JOIN Benutzer ON rp.GRANTEE = users.usr UNION SELECT gewährt_role FROM Rolle_role_privs WHERE Rolle IN (SELECT gewährt_role FROM dba_r GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp JOIN-Rollen r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dp_t. usr), sys_privileges AS (SELECT-Berechtigung FROM dba_sys_privs dsp JOIN-Benutzer ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY-Eigentümer, Tabellenname --SELECT * FROM sys_privileges

Pradeep Dewani
quelle