Comment afficher tous les privilèges d'un utilisateur dans oracle?
Quelqu'un peut-il me dire comment afficher tous les privilèges/règles d'un utilisateur spécifique dans la console sql?
5 réponses
Vous pouvez essayer ces vues ci-dessous.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
Les DBA Et les autres utilisateurs puissants peuvent trouver les privilèges accordés aux autres utilisateurs avec les versions DBA_
de ces mêmes vues. Ils sont couverts dans la documentation .
Ces vues ne montrent que les privilèges accordés directement à l'utilisateur. Trouver tous les les privilèges, y compris ceux accordés indirectement par des rôles, nécessite des instructions SQL récursives plus compliquées:
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 y a différents scripts flottant autour qui le feront en fonction de la folie que vous voulez obtenir. J'utiliserais personnellement le script find_all_privs de Pete Finnigan .
Si vous voulez l'écrire vous-même, la requête devient plutôt difficile. Les utilisateurs peuvent se voir accorder des privilèges système visibles dans DBA_SYS_PRIVS
. On peut leur accorder des privilèges d'objet qui sont visibles dans DBA_TAB_PRIVS
. Et ils peuvent recevoir des rôles visibles dans DBA_ROLE_PRIVS
(les rôles peuvent être par défaut ou non par défaut et peut également nécessiter un mot de passe, donc juste parce qu'un utilisateur a reçu un rôle ne signifie pas que l'utilisateur peut nécessairement utiliser les privilèges qu'il a acquis via le rôle par défaut). Mais ces rôles peuvent, à leur tour, être accordée système de privilèges, privilèges objet, et des rôles supplémentaires qui peuvent être consultés en regardant 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 arriver à un utilisateur.
Une Autre ressource utile:
Http://psoug.org/reference/roles.html
- DBA_SYS_PRIVS
- DBA_TAB_PRIVS
- DBA_ROLE_PRIVS
Vous pouvez utiliser le code ci - dessous pour obtenir toutes les listes de privilèges de tous les utilisateurs.
select * from dba_sys_privs
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 trop si vous cherchez à faire quelque chose par programme. J'ai donc mis en place ma propre requête:
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
;
Avantages:
- je peux facilement filtrer par beaucoup d'informations différentes, comme l'objet, le privilège, que ce soit à travers un rôle particulier, etc. juste en changeant cette clause
WHERE
. - C'est une seule requête, ce qui signifie que je n'ai pas à composer mentalement les résultats ensemble.
- Il résout la question de savoir s'ils peuvent accorder le privilège ou non et s'il inclut les privilèges pour les sous-objets (la partie" hiérarchique") à travers les sources de différences du privilège.
- Il est facile de voir tout ce que je dois faire pour révoquer le privilège, car il répertorie toutes les sources du privilège.
- Il combine les privilèges de table et de système en une seule vue cohérente, nous permettant de lister tous les les privilèges d'un utilisateur d'un seul coup.
- c'est une requête , Pas une fonction qui vomit tout cela à
DBMS_OUTPUT
ou quelque chose (par rapport au script lié de Pete Finnigan). Cela le rend utile pour une utilisation programmatique et pour l'exportation. - , Le filtre n'est pas répété; il n'apparaît qu'une fois. Cela rend plus facile à modifier.
- la sous-requête peut facilement être retirée si vous devez l'examiner par chaque individu
GRANT
.