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?
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>UNIONSELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON(rp.granted_role = rsp.role)WHERE rp.grantee =<theUser>ORDERBY1;
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>ORDERBY owner, table_name;
Indirekte Zuschüsse für Tabellen / Ansichten:
SELECTDISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON(rp.granted_role = rtp.role)WHERE rp.grantee =<theUser>ORDERBY owner, table_name;
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.
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 currentuseris the grantee
Object grants for which an enabled role orPUBLICis 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:
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.
selectdistinct'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 NameOR RP.GRANTEE in('YOUR USER'))--Change User Nameand RP.GRANTEE notin('SYS','SYSTEM');
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
role_role_privs
TischCONNECT 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 :
Dies gibt keine Objekte zurück, die dem Benutzer gehören. Wenn Sie diese benötigen, verwenden Sie
all_tab_privs
stattdessen die Ansicht.quelle
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,
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:
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:
Beachten Sie, dass es in Oracle keine DBA_TAB_PRIVS_RECD-Ansicht gibt.
quelle
Die umfassendste und zuverlässigste Methode, die ich kenne, ist immer noch die Verwendung von DBMS_METADATA :
Interessante Antworten.
quelle
quelle
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
quelle