Risposte:
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;
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_PRIVS
e ROLE_ROLE_PRIVS
. Lo script di Pete esamina queste relazioni per mostrare tutti i privilegi che finiscono per fluire a un utente.
SYS
privilegi e vogliono solo guardare ai privilegi del nostro account, la sceneggiatura è completamente inutile. Non ho accesso UTL_FILE
né a né DBA_SYS_PRIVS
all'altra DBA
e alle SYS
aree su cui lo script guarda.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
e ha ROLE_ROLE_PRIVS
bisogno di essere esaminato. I documenti indicano che sono per l' utente corrente .
Un'altra risorsa utile:
http://psoug.org/reference/roles.html
DBA
o SYS
e desideri solo trovare i privilegi del tuo account.
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:
WHERE
clausola.DBMS_OUTPUT
o qualcosa del genere (rispetto allo script collegato di Pete Finnigan). Ciò lo rende utile per l'uso programmatico e per l'esportazione.GRANT
.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.
È possibile utilizzare il codice seguente per ottenere l'elenco di tutti i privilegi da tutti gli utenti.
select * from dba_sys_privs
Per mostrare tutti i privilegi:
seleziona il nome da system_privilege_map;