Come mostrare tutti i privilegi di un utente in Oracle?


113

Qualcuno può dirmi come mostrare tutti i privilegi / regole di un utente specifico nella console sql?

Risposte:


164

Puoi provare queste visualizzazioni di seguito.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

Gli amministratori di database e altri utenti esperti possono trovare i privilegi concessi ad altri utenti con le DBA_versioni di queste stesse viste. Sono trattati nella documentazione .

Queste visualizzazioni mostrano solo i privilegi concessi direttamente all'utente. Trovare tutti i privilegi, inclusi quelli concessi indirettamente tramite i ruoli, richiede istruzioni SQL ricorsive più complicate:

select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;

21

Ci sono vari script in giro che lo faranno a seconda di quanto vuoi diventare pazzo. Personalmente userei lo script find_all_privs di Pete Finnigan .

Se vuoi scriverlo da solo, la query diventa piuttosto impegnativa. Agli utenti possono essere concessi privilegi di sistema visibili in DBA_SYS_PRIVS. Possono essere concessi privilegi oggetto visibili in DBA_TAB_PRIVS. E possono essere concessi ruoli visibili in DBA_ROLE_PRIVS(i ruoli possono essere predefiniti o non predefiniti e possono richiedere anche una password, quindi solo perché a un utente è stato concesso un ruolo non significa che l'utente possa necessariamente utilizzare i privilegi che ha acquisito tramite il ruolo di default). Ma quei ruoli possono, a loro volta, essere privilegi concessi sistema, privilegi oggetti e ruoli aggiuntivi che possono essere visti, cercando in ROLE_SYS_PRIVS, ROLE_TAB_PRIVSe ROLE_ROLE_PRIVS. Lo script di Pete esamina queste relazioni per mostrare tutti i privilegi che finiscono per fluire a un utente.


Lo script è fantastico, l'ho appena controllato
I.Tyger,

1
Hai bisogno dei privilegi per il pacchetto UTL_FILE altrimenti ricevi un errore durante l'esecuzione dello script di Pete Finnigan: "l'identificatore 'UTL_FILE' deve essere dichiarato". Puoi connetterti come sys con roll sysdba tramite SQL Developer e poi funzionerà o ti concederai i privilegi di esecuzione per questo pacchetto usando: grant execute on UTL_FILE to <user>;
gennaio

1
E per quelli di noi senza SYSprivilegi e vogliono solo guardare ai privilegi del nostro account, la sceneggiatura è completamente inutile. Non ho accesso UTL_FILEné a né DBA_SYS_PRIVSall'altra DBAe alle SYSaree su cui lo script guarda.
vapcguy

Non penso ROLE_SYS_PRIVS, ROLE_TAB_PRIVSe ha ROLE_ROLE_PRIVSbisogno di essere esaminato. I documenti indicano che sono per l' utente corrente .
jpmc26

Se qualcuno ha una copia di questi script, può pubblicare qui o da qualche parte un po 'più evergreen come un gist? Il sito è inattivo.
Michael Thompson,


2

Mentre la risposta di Raviteja Vutukuri funziona ed è veloce da mettere insieme, non è particolarmente flessibile per variare i filtri e non aiuta troppo se stai cercando di fare qualcosa a livello di programmazione. Quindi ho messo insieme la mia domanda:

SELECT
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME,
    LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
    MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
    MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
    -- Gets all roles a user has, even inherited ones
    WITH ALL_ROLES_FOR_USER AS (
        SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
        FROM DBA_ROLE_PRIVS
        CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
    )
    SELECT
        PRIVILEGE,
        OBJ_OWNER,
        OBJ_NAME,
        USERNAME,
        REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
        ADMIN_OR_GRANT_OPT,
        HIERARCHY_OPT
    FROM (
        -- System privileges granted directly to users
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- System privileges granted users through roles
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
        UNION ALL
        -- Object privileges granted directly to users
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- Object privileges granted users through roles
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
    ) ALL_USER_PRIVS
    -- Adjust your filter here
    WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME
;

vantaggi:

  • Posso facilmente filtrare in base a molte diverse informazioni, come l'oggetto, il privilegio, sia attraverso un ruolo particolare, ecc., Semplicemente cambiando quella WHEREclausola.
  • È una singola query, il che significa che non devo comporre mentalmente i risultati insieme.
  • Risolve il problema se possono concedere il privilegio o meno e se include i privilegi per i suboggetti (la parte "gerarchica") tra le diverse origini del privilegio.
  • È facile vedere tutto ciò che devo fare per revocare il privilegio, poiché elenca tutte le fonti del privilegio.
  • Combina i privilegi di tabella e di sistema in un'unica visualizzazione coerente, permettendoci di elencare tutti i privilegi di un utente in un colpo solo.
  • È una query , non una funzione che sputa tutto questo DBMS_OUTPUTo qualcosa del genere (rispetto allo script collegato di Pete Finnigan). Ciò lo rende utile per l'uso programmatico e per l'esportazione.
  • Il filtro non viene ripetuto; appare solo una volta. Questo rende più facile cambiare.
  • La sottoquery può essere facilmente estratta se è necessario esaminarla da ogni individuo GRANT.

Alcuni TODO per me stesso: 1. Aggiungere un indicatore se l'utente può concedere il privilegio concedendo un ruolo a un altro utente. 2. Capire come eseguire questa operazione per l'utente corrente senza privilegi DBA. Probabilmente coinvolge USER_SYS_PRIVS(privilegi di sistema concessi direttamente), USER_TAB_PRIVS(priv oggetto concesso direttamente) USER_ROLE_PRIVS(ruoli concessi direttamente dall'utente), ROLE_ROLE_PRIVS(per ottenere ruoli ereditati), ROLE_SYS_PRIVS(privilegi di sistema tramite ruoli) e ROLE_TAB_PRIVS(priv oggetto tramite ruoli). Ugh. Oracle è così complicato.
jpmc26

1

È possibile utilizzare il codice seguente per ottenere l'elenco di tutti i privilegi da tutti gli utenti.

select * from dba_sys_privs 

Questo non elenca tutti i privilegi. Come dimostrato da molte altre risposte che hanno preceduto la tua di anni , omette i privilegi di tabella e tutti i privilegi concessi tramite i ruoli.
jpmc26

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.