web-dev-qa-db-fra.com

Comment trouver les privilèges et les rôles accordés à un utilisateur dans Oracle?

J'utilise Linux, Oracle10g. J'ai créé un utilisateur appelé test. et accordé une session de création et sélectionnez une autorisation de dictionnaire pour le même utilisateur.

j'ai également attribué des rôles sysdba et sysoper aux mêmes utilisateurs.

Maintenant, je veux afficher tous les privilèges et rôles accordés à l'utilisateur. J'ai trouvé la requête suivante, mais elle ne montre que l'option créer une session et sélectionner les privilèges du dictionnaire.

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

s'il vous plaît aider à résoudre le problème.

Merci

73
Abhimanyu garg

Regardez http://docs.Oracle.com/cd/B10501_01/server.920/a96521/privs.htm#15665

Vérifiez les tables USER_SYS_PRIVS, USER_TAB_PRIVS, USER_ROLE_PRIVS.

50
VAV

En plus de la réponse de VAV, la première était la plus utile dans mon environnement

select * from USER_ROLE_PRIVS where USERNAME='SAMPLE';
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE';
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE';
65
user2668478

Aucune des autres réponses ne fonctionnant pour moi, j'ai donc écrit ma propre solution:

À partir d'Oracle 11g.

Remplacer USER par le nom d'utilisateur souhaité

Rôles accordés:

SELECT * 
  FROM DBA_ROLE_PRIVS 
 WHERE GRANTEE = 'USER';

Privilèges accordés directement à l'utilisateur:

SELECT * 
  FROM DBA_TAB_PRIVS 
 WHERE GRANTEE = 'USER';

Privilèges accordés au rôle attribué à l'utilisateur:

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

Privilèges système accordés:

SELECT * 
  FROM DBA_SYS_PRIVS 
 WHERE GRANTEE = 'USER';

Si vous souhaitez rechercher l'utilisateur pour lequel vous êtes actuellement connecté, vous pouvez remplacer DBA dans le nom de la table par USER et supprimer la clause WHERE.

48
Mocking

Les privilèges SI sont accordés à un utilisateur via certains rôles, puis SQL peut être utilisé

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';
10
upog

En combinant les suggestions précédentes pour déterminer vos autorisations personnelles (autorisations "UTILISATEUR"), utilisez ceci:

-- 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);
8
ShamrockCS
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%';
1
user2615480
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2')
)
1
shans

toujours rendre SQL réutilisable: - :)

-- ===================================================
-- &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
dave