Quelqu'un peut-il s'il vous plaît me dire comment afficher tous les privilèges/règles d'un utilisateur spécifique dans la console SQL?
Le script est génial, je viens de le vérifier.
Quelqu'un peut-il s'il vous plaît me dire comment afficher tous les privilèges/règles d'un utilisateur spécifique dans la console SQL?
Vous pouvez essayer les vues ci-dessous.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
Les DBA et autres utilisateurs avancés peuvent trouver les privilèges accordés à d'autres utilisateurs avec les versions DBA_
de ces mêmes vues. Ils sont couverts dans la documentation.
Ces vues montrent uniquement les privilèges accordés directement à l'utilisateur. Trouver tous les privilèges, y compris ceux accordés indirectement par le biais des rôles, nécessite des déclarations SQL récursives plus complexes :
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;
Il existe divers scripts qui vous permettront de le faire selon le niveau de complexité que vous souhaitez atteindre. Personnellement, j'utiliserais le script find_all_privs de Pete Finnigan.
Si vous préférez l'écrire vous-même, la requête devient assez complexe. Les utilisateurs peuvent se voir accorder des privilèges système qui sont visibles dans DBA_SYS_PRIVS
. Ils peuvent se voir accorder des privilèges sur des objets qui sont visibles dans DBA_TAB_PRIVS
. Et ils peuvent se voir attribuer des rôles qui sont visibles dans DBA_ROLE_PRIVS
(les rôles peuvent être par défaut ou non, et peuvent nécessiter un mot de passe, donc le fait qu'un utilisateur ait été attribué un rôle ne signifie pas nécessairement qu'il puisse utiliser les privilèges qu'il a acquis grâce au rôle par défaut). Mais ces rôles peuvent, à leur tour, se voir accorder des privilèges système, des privilèges sur des objets et des rôles supplémentaires qui peuvent être consultés en examinant ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
et ROLE_ROLE_PRIVS
. Le script de Pete parcourt ces relations pour montrer tous les privilèges qui finissent par être attribués à un utilisateur.
Vous avez besoin de privilèges pour le package UTL_FILE sinon vous obtiendrez une erreur lors de l'exécution du script de Pete Finnigan : "l'identificateur 'UTL_FILE' doit être déclaré". Vous pouvez vous connecter en tant que sys avec le rôle sysdba via SQL Developer et ensuite cela fonctionnera ou vous accorder des privilèges d'exécution sur ce package en utilisant : grant execute on UTL_FILE to ;
Et pour ceux d'entre nous sans privilèges SYS
et qui veulent simplement regarder les privilèges de notre propre compte, le script est totalement inutile. Je n'ai pas accès à UTL_FILE
ni à DBA_SYS_PRIVS
et aux autres zones DBA
et SYS
que le script examine.
Autre ressource utile :
http://psoug.org/reference/roles.html
Alors que la réponse de Raviteja Vutukuri fonctionne et est rapide à mettre en place, elle n'est pas particulièrement flexible pour varier les filtres et n'aide pas beaucoup si vous cherchez à faire quelque chose de manière programmable. J'ai donc créé ma propre requête :
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Liste les sources de la permission
MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX agit comme un OU booléen en choisissant 'YES' plutôt que 'NO'
MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX agit comme un OU booléen en choisissant 'YES' plutôt que 'NO'
FROM (
-- Obtient tous les rôles qu'un utilisateur possède, même ceux hérités
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 à l'utilisateur') AS GRANT_TARGET,
ADMIN_OR_GRANT_OPT,
HIERARCHY_OPT
FROM (
-- Privilèges système accordés directement aux utilisateurs
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
-- Privilèges système accordés aux utilisateurs via des rôles
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
-- Privilèges objets accordés directement aux utilisateurs
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
-- Privilèges objets accordés aux utilisateurs via des rôles
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER 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
-- Ajustez votre filtre ici
WHERE USERNAME = 'NOM_UTILISATEUR'
) DISTINCT_USER_PRIVS
GROUP BY
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME
;
Avantages :
WHERE
.DBMS_OUTPUT
ou quelque chose du genre (comparé au script lié de Pete Finnigan). Cela le rend utile pour une utilisation programmatique et pour l'exportation.GRANT
individuel.
Certains TODO pour moi-même: 1. Ajouter un indicateur si un utilisateur peut accorder le privilège en accordant un rôle à un autre utilisateur. 2. Trouver comment faire cela pour l'utilisateur actuel sans privilèges de DBA. Probablement implique USER_SYS_PRIVS
(privilèges système directement accordés), USER_TAB_PRIVS
(privilèges d'objet accordés directement), USER_ROLE_PRIVS
(rôles directement accordés à l'utilisateur), ROLE_ROLE_PRIVS
(pour obtenir les rôles hérités), ROLE_SYS_PRIVS
(privilèges système par le biais des rôles) et ROLE_TAB_PRIVS
(privilèges d'objet par le biais des rôles). Oracle est tellement compliqué.
Version oracle plus simple en une seule requête.
AVEC données
COMME (SELECT granted_role
FROM dba_role_privs
CONNECT BY PRIOR granted_role = grantee
START WITH grantee = '&USER')
SÉLECTIONNER 'SYSTÈME' typ,
grantee grantee,
privilege priv,
admin_option ad,
'--' tabnm,
'--' colnm,
'--' owner
DEPUIS dba_sys_privs
OÙ grantee = '&USER'
OU grantee DANS (SELECT granted_role
FROM data)
UNION
SÉLECTIONNER 'TABLE' typ,
grantee grantee,
privilege priv,
grantable ad,
table_name tabnm,
'--' colnm,
owner owner
DEPUIS dba_tab_privs
OÙ grantee = '&USER'
OU grantee DANS (SELECT granted_role
FROM data)
ORDRE PAR 1;
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.