Wie finde ich die Berechtigungen und Rollen, die einem Benutzer in Oracle gewährt wurden? [Duplikat]

77

Ich benutze Linux, Oracle10g. Ich habe einen Benutzer namens test erstellt. und erteilte Erstellungssitzung und wähle eine beliebige Wörterbuchberechtigung für denselben Benutzer aus.

Ich habe den gleichen Benutzern auch Sysdba- und Sysoper-Rollen gewährt.

Jetzt möchte ich alle Berechtigungen und Rollen anzeigen, die dem Benutzer gewährt wurden. Ich habe die folgende Abfrage gefunden, aber es werden nur Sitzungen zum Erstellen und Auswählen von Wörterbuchberechtigungen angezeigt.

select privilege 
from dba_sys_privs 
where grantee='SAMPLE' 
order by 1;

Bitte helfen Sie, das Problem zu beheben.

Vielen Dank

Abhimanyu garg
quelle
Sie können Data Dictionary Documentation
Slava Babin

Antworten:

61

Siehe http://docs.oracle.com/cd/B10501_01/server.920/a96521/privs.htm#15665

Überprüfen Sie die Tabellen USER_SYS_PRIVS, USER_TAB_PRIVS und USER_ROLE_PRIVS mit diesen select-Anweisungen

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS; 
SELECT * FROM USER_ROLE_PRIVS;
VAV
quelle
37
Mit anderen Worten, machen Sie SELECT * FROMdiese Tabellen. Lass uns nicht faul werden ... Ich ärgere mich, wenn ich keinen Code sehe. Nicht jeder kann Ihre Gedanken über die genaue Syntax lesen, und Dokumentationslinks können verschoben werden.
Vapcguy
12
Für die Faulen da draußen: SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS;
Victor Romano
Wenn Sie eine Person sind, die nach Rollen sucht, die "wie auch immer in der Datenbank" wie ich vergeben wurden, USER_ROLE_PRIVSfunktioniert dies nicht für Sie, weil: "USER_ROLE_PRIVS beschreibt die Rollen, die dem aktuellen Benutzer gewährt wurden", wie in der Oracle-Dokumentation angegeben. Stattdessen sollten Sie in der DBA_ROLE_PRIVSAnsicht nach Informationen suchen . Warum? Denn: "DBA_ROLE_PRIVS beschreibt die Rollen, die allen Benutzern und Rollen in der Datenbank gewährt wurden"
Adrián Jaramillo
70

Zusätzlich zur Antwort von VAV war die erste in meiner Umgebung am nützlichsten

select * from USER_ROLE_PRIVS where USERNAME='SAMPLE';
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE';
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE';
user2668478
quelle
8
+1 sehr vollständig. Setzen Sie "Benutzer" anstelle von Beispiel, um Informationen über den aktuell angemeldeten Benutzer zu erhalten
daitangio
3
Hinweis: Wenn Sie verwenden dba_XXX_privs, lautet der Spaltenname granteeanstelle von username.
Mr. Llama
57

Keine der anderen Antworten hat bei mir funktioniert, also habe ich meine eigene Lösung geschrieben:

Ab Oracle 11g.

Ersetzen Sie USER durch den gewünschten Benutzernamen

Zugegebene Rollen:

SELECT * 
  FROM DBA_ROLE_PRIVS 
 WHERE GRANTEE = 'USER';

Direkt dem Benutzer gewährte Berechtigungen:

SELECT * 
  FROM DBA_TAB_PRIVS 
 WHERE GRANTEE = 'USER';

Berechtigungen für die dem Benutzer gewährte Rolle:

SELECT * 
  FROM DBA_TAB_PRIVS  
 WHERE GRANTEE IN (SELECT granted_role 
                     FROM DBA_ROLE_PRIVS 
                    WHERE GRANTEE = 'USER');

Gewährte Systemberechtigungen:

SELECT * 
  FROM DBA_SYS_PRIVS 
 WHERE GRANTEE = 'USER';

Wenn Sie nach dem Benutzer suchen möchten, mit dem Sie gerade verbunden sind, können Sie DBA im Tabellennamen durch USER ersetzen und die WHERE-Klausel entfernen.

Verspottung
quelle
Dies ist die beste Antwort. Vielen Dank.
Baodad
Hier ist noch eine, um das Ganze abzurunden: Systemberechtigungen für die dem Benutzer gewährte Rolle: SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE IN (SELECT grant_role FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'DWMGR');
em_bo
10

Wenn einem Benutzer über einige Rollen Berechtigungen erteilt werden, kann unten SQL verwendet werden

select * from ROLE_ROLE_PRIVS where ROLE = 'ROLE_NAME';
select * from ROLE_TAB_PRIVS  where ROLE = 'ROLE_NAME';
select * from ROLE_SYS_PRIVS  where ROLE = 'ROLE_NAME';
upog
quelle
Sehr hilfreich, um tiefer zu graben, wenn Sie Rechte über Rollen erhalten haben. Die zweite Abfrage hat mir sehr geholfen zu überprüfen, ob mir eines unserer Zugriffsrechte für Tabellen zur Verfügung gestellt wurde.
Nanosoft
9

Kombinieren Sie die früheren Vorschläge, um Ihre persönlichen Berechtigungen (dh 'USER'-Berechtigungen) zu ermitteln, und verwenden Sie dann Folgendes:

-- your permissions
select * from USER_ROLE_PRIVS where USERNAME= USER;
select * from USER_TAB_PRIVS where Grantee = USER;
select * from USER_SYS_PRIVS where USERNAME = USER;

-- granted role permissions
select * from ROLE_ROLE_PRIVS where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_TAB_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_SYS_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
ShamrockCS
quelle
1
Ausgezeichnet! Dies sollte die wahre Antwort sein!
Vapcguy
Ich denke, dass dies die beste Antwort ist. Es funktioniert wirklich gut für mich.
Diego Romero Rodriguez
2
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%';
user2615480
quelle
1
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2')
)
shans
quelle
0

Machen Sie SQL immer wieder verwendbar: - :)

-- ===================================================
-- &role_name will be "enter value for 'role_name'".
-- Date:  2015 NOV 11.

-- sample code:   define role_name=&role_name
-- sample code:   where role like '%&&role_name%'
-- ===================================================


define role_name=&role_name

select * from ROLE_ROLE_PRIVS where ROLE = '&&role_name';
select * from ROLE_SYS_PRIVS  where ROLE = '&&role_name';


select role, privilege,count(*)
 from ROLE_TAB_PRIVS
where ROLE = '&&role_name'
group by role, privilege
order by role, privilege asc
;
Dave
quelle
Überprüft die ROLESGruppe nur auf eine bestimmte Rolle. Wenn wir Wiederverwertbarkeit sprechen, sollte es 1) Schleife durch die USERGruppe und spuckte *aus USER_ROLE_PRIVS, USER_TAB_PRIVSund USER_SYS_PRIVS , für einen bestimmten Benutzer, dann 2) die Rollen für den jeweiligen Benutzer geben , die eingegeben wird (wie in ShamrockCS‘Antwort). Ich denke, angesichts der Frage des OP wollen wir hier die Eigenschaften eines bestimmten Benutzers kennen, nicht die Benutzer mit einer bestimmten Rolle.
Vapcguy
0

Das einzige sichtbare Ergebnis, das ich verstehen konnte, war, mich zuerst mit dem Benutzer zu verbinden, für den ich die Rechte erhalten wollte, und dann mit der folgenden Abfrage:

SELECT GRANTEE, PRIVILEGE, TABLE_NAME FROM USER_TAB_PRIVS;
Pierre Hamon
quelle