Comment afficher tous les privilèges d'un utilisateur dans Oracle?

113

Quelqu'un peut-il me dire comment afficher tous les privilèges / règles d'un utilisateur spécifique dans la console sql?

destin
la source

Réponses:

164

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;
Teja
la source
21

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_PRIVSet ROLE_ROLE_PRIVS. Le script de Pete parcourt ces relations pour montrer tous les privilèges qui finissent par être attribués à un utilisateur.

Justin Cave
la source
Le script est génial juste vérifié
I.Tyger
1
Vous avez besoin de privilèges sur le package UTL_FILE ou bien vous obtenez une erreur lors de l'exécution du script de Pete Finnigan: "l'identifiant 'UTL_FILE' doit être déclaré". Vous pouvez vous connecter en tant que sys avec roll sysdba via SQL Developer, puis cela fonctionnera ou vous accordera des privilèges d'exécution sur ce package en utilisant: grant execute on UTL_FILE to <user>;
Jan
1
Et pour ceux d'entre nous qui n'ont pas de SYSprivilè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_FILEni à ni aux DBA_SYS_PRIVSautres DBAet SYSzones que le script examine.
vapcguy
Je ne pense pas ROLE_SYS_PRIVS, ROLE_TAB_PRIVSet ROLE_ROLE_PRIVSdoit être examinée. Les documents indiquent qu'ils sont destinés à l' utilisateur actuel .
jpmc26
Si quelqu'un a une copie de ces scripts, peut-il publier ici ou quelque part un peu plus à feuilles persistantes comme l'essentiel? Le site est en panne.
Michael Thompson
7

Une autre ressource utile:

http://psoug.org/reference/roles.html

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
Ageu
la source
2
Sauf si vous n'avez pas de rôles DBAou SYS, et que vous voulez juste trouver les privilèges de votre propre compte.
vapcguy
2

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:

  • 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. simplement en changeant celui-ci WHERE clause.
  • C'est une seule requête, ce qui signifie que je n'ai pas à composer mentalement les résultats ensemble.
  • Cela résout le problème 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 différentes sources 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 système en une seule vue cohérente, ce qui nous permet de lister tous les privilèges d'un utilisateur d'un seul coup.
  • C'est une question , pas une fonction qui crache tout cela DBMS_OUTPUTou 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 seule fois. Cela facilite le changement.
  • La sous-requête peut facilement être retirée si vous avez besoin de l'examiner par chaque individu GRANT.
jpmc26
la source
Quelques TODO pour moi-même: 1. Ajouter un indicateur si l'utilisateur peut accorder le privilège en accordant un rôle à un autre utilisateur. 2. Découvrez comment procéder pour l'utilisateur actuel sans privilèges DBA. Implique probablement 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é.
jpmc26
1

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 
Ravi Bhushan
la source
Cela ne répertorie pas tous les privilèges. Comme l'ont démontré plusieurs autres réponses qui ont précédé la vôtre par des années , il omet les privilèges de table et tous les privilèges accordés via les rôles.
jpmc26
-1

Pour afficher tous les privilèges:

sélectionnez le nom dans system_privilege_map;

Yerbol Baigarayev
la source