2013-02-25 17 views
50

Sto usando Linux, Oracle10g. Ho creato un utente chiamato test. e concesso creare la sessione e selezionare qualsiasi autorizzazione del dizionario per lo stesso utente.Come trovare i privilegi e i ruoli concessi a un utente in Oracle?

ho anche assegnato i ruoli sysdba e sysoper agli stessi utenti.

Ora voglio visualizzare tutti i privilegi e i ruoli concessi all'utente. Ho trovato la seguente query ma mostra solo creare la sessione e selezionare i privilegi del dizionario.

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

Si prega di aiutare a risolvere il problema.

Grazie

+0

È possibile utilizzare [Documentazione del dizionario dati] (http://stackoverflow.com/documentation/oracle/7347/data-dictionary#t=201610091552406899855) –

risposta

29

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

Controlla USER_SYS_PRIVS, USER_TAB_PRIVS, USER_ROLE_PRIVS tavoli.

+14

In altre parole, fare 'SELECT * FROM' quelle tabelle. Non diventiamo pigri ... mi arrabbio quando non vedo il codice. Non tutti possono leggere la tua mente per una sintassi esatta e i collegamenti alla documentazione possono essere spostati. – vapcguy

+0

Risposta perfetta. Dritto al punto. – Doogle

+1

Per i più pigri là fuori: 'select * from USER_SYS_PRIVS;' ' SELECT * FROM USER_TAB_PRIVS;' ' SELECT * FROM USER_ROLE_PRIVS;' –

0
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%'; 
+0

Hi ... Perché dovremmo usare come se conosciamo il nome esatto. LIKE rende costose le query .... – Avrajit

1
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role 
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2') 
) 
46

Oltre alla risposta di VAV, il primo era più utile nel mio ambiente

select * from USER_ROLE_PRIVS where USERNAME='SAMPLE'; 
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE'; 
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE'; 
+2

+1 molto completo. Metti "utente" invece di campione per ottenere informazioni sull'utente registrato corrente – daitangio

+1

Nota: se stai usando 'dba_XXX_privs', il nome della colonna è' grantee' invece di 'username'. –

8

SE privilegi sono dati a un utente attraverso alcuni ruoli, quindi al di sotto di SQL può essere utilizzato

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'; 
+0

molto utile per scavare più a fondo quando si dispone dei diritti forniti tramite i ruoli .. Seconda query mi ha aiutato molto a controllare se mi viene fornito un diritto di accesso al nostro tavolo. – nanosoft

4

Combinare i suggerimenti precedenti per determinare le autorizzazioni personali (ad esempio le autorizzazioni "UTENTE" la sua:

-- 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); 
+0

Eccellente! Questa dovrebbe essere la vera risposta! – vapcguy

0

fanno sempre SQL ri-usuable: - :)

-- =================================================== 
-- &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 
; 
+0

Controlla solo il gruppo 'ROLES' per un determinato ruolo. Se parliamo di riusabilità, dovrebbe 1) passare attraverso il gruppo 'USER' e sputare' * 'da' USER_ROLE_PRIVS', 'USER_TAB_PRIVS', e' USER_SYS_PRIVS', per un dato utente, quindi 2) assegnare i ruoli per l'utente specificato che viene inserito (come nella risposta di ShamrockCS). Penso che data la domanda dell'OP, è dove vogliamo conoscere le proprietà di un determinato utente, non gli utenti con un determinato ruolo. – vapcguy

21

Nessuna delle altre risposte ha lavorato per me, così ho scritto la mia soluzione:

Come di Oracle 11g .

Sostituire USER con il nome utente desiderato

Ruoli concesso:

SELECT * 
    FROM DBA_ROLE_PRIVS 
WHERE GRANTEE = 'USER'; 

privilegi concessi direttamente agli utenti:

SELECT * 
    FROM DBA_TAB_PRIVS 
WHERE GRANTEE = 'USER'; 

privilegi concessi al ruolo concesse all'utente :

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

concessi privilegi di sistema:

SELECT * 
    FROM DBA_SYS_PRIVS 
WHERE GRANTEE = 'USER'; 

Se si desidera di ricerca per l'utente che si è connessi come, è possibile sostituire DBA nel nome della tabella con USER e rimuovere la clausola WHERE .

+0

Questa è la migliore risposta. Grazie. – Baodad

Problemi correlati