118 votes

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

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?

173voto

SOaddict Points 2815

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;

21voto

Justin Cave Points 114578

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.

0 votes

Le script est génial, je viens de le vérifier.

1 votes

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 ;

1 votes

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.

7voto

Ageu Points 104

Autre ressource utile :

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

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS

2 votes

Sauf si vous n'avez pas les rôles DBA ou SYS, et que vous voulez simplement trouver les privilèges de votre propre compte.

3voto

jpmc26 Points 3364

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 :

  • Je peux facilement filtrer par beaucoup d'informations différentes, comme l'objet, le privilège, qu'il soit via un rôle particulier, etc. en changeant simplement la clause WHERE.
  • 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 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 liste toutes les sources du privilège.
  • Il combine les privilèges tableaux et système dans une vue cohérente unique, nous permettant de lister tous les privilèges d'un utilisateur en une seule fois.
  • C'est une requête, pas une fonction qui rejette tout cela sur 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.
  • Le filtre n'est pas répété ; il n'apparaît qu'une seule fois. Cela le rend plus facile à modifier.
  • La sous-requête peut facilement être extraite si vous devez l'examiner par chaque GRANT individuel.

0 votes

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é.

0voto

Arpit Bhardwaj Points 1

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.com

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.

Powered by:

X