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 administrateurs de base de données et les autres utilisateurs expérimentés peuvent trouver les privilèges accordés à d'autres utilisateurs avec les DBA_
versions de ces mêmes vues. Ils sont traités dans la documentation .
Ces vues affichent uniquement les privilèges accordés directement à l'utilisateur. La recherche de tous les privilèges, y compris ceux accordés indirectement via les 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 existe divers scripts flottant qui le feront en fonction de la façon dont vous voulez devenir fou. J'utiliserais personnellement le script find_all_privs de Pete Finnigan .
Si vous voulez l'écrire vous-même, la requête devient assez difficile. Les utilisateurs peuvent se voir accorder des privilèges système qui sont visibles dans DBA_SYS_PRIVS
. Ils peuvent recevoir des privilèges d'objet 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 par défaut et peuvent également exiger un mot de passe, donc ce n'est pas parce qu'un utilisateur a obtenu un rôle que l'utilisateur peut nécessairement utiliser les privilèges qu'il acquis via le rôle par défaut). Mais ces rôles peuvent, à leur tour, être des privilèges système accordés, des privilèges d'objet et d' autres rôles qui peuvent être visionné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 être attribués à un utilisateur.
SYS
privilèges et qui veulent juste regarder les privilèges de notre propre compte, le script n'a absolument aucune valeur. Je n'ai pas accès UTL_FILE
ni à ni aux DBA_SYS_PRIVS
autres DBA
et SYS
zones que le script examine.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
et ROLE_ROLE_PRIVS
doit être examinée. Les documents indiquent qu'ils sont destinés à l' utilisateur actuel .
Une autre ressource utile:
http://psoug.org/reference/roles.html
DBA
ou SYS
, et que vous voulez juste trouver les privilèges de votre propre compte.
Bien que la réponse de Raviteja Vutukuri fonctionne et soit rapide à assembler, elle n'est pas particulièrement flexible pour faire varier les filtres et n'aide pas trop si vous cherchez à faire quelque chose par programme. J'ai donc rédigé 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:
WHERE
clause.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.GRANT
.USER_SYS_PRIVS
(privilèges système accordés directement), USER_TAB_PRIVS
(privilèges d'objet accordés directement) USER_ROLE_PRIVS
(rôles attribués directement à l'utilisateur), ROLE_ROLE_PRIVS
(pour obtenir les rôles hérités), ROLE_SYS_PRIVS
(privilèges système via les rôles) et ROLE_TAB_PRIVS
(privilèges d'objet via les rôles). Pouah. Oracle est tellement compliqué.
Vous pouvez utiliser le code ci-dessous pour obtenir la liste de tous les privilèges de tous les utilisateurs.
select * from dba_sys_privs
Pour afficher tous les privilèges:
sélectionnez le nom dans system_privilege_map;