Antworten:
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;
role_role_privs
Tisch CONNECT BY PRIOR granted_role = role
zu bleiben und dann in transitive Rollenprivilegien zurückzukehren ...
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_privs
stattdessen die Ansicht.
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.
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.
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')
;
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