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?

93
demandé sur kylealonius 2012-03-21 23:39:23

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;
137
répondu Teja 2016-04-01 04:17:01

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.

18
répondu Justin Cave 2012-03-21 20:12:30

Une Autre ressource utile:

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

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
6
répondu Ageu 2014-02-03 16:40:43

Vous pouvez utiliser le code ci - dessous pour obtenir toutes les listes de privilèges de tous les utilisateurs.

select * from dba_sys_privs 
2
répondu Ravi Bhushan 2017-06-20 13:19:22

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.
0
répondu jpmc26 2018-07-13 08:37:08