web-dev-qa-db-fra.com

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?

97
destiny

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 privilégiés 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 montrent uniquement les privilèges accordés directement à l'utilisateur. La recherche de all des privilèges, y compris ceux accordés indirectement par le biais de rôles, nécessite des instructions 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;
141
Teja

Différents scripts circulent à ce moment-là en fonction de la folie que vous souhaitez avoir. Personnellement, j'utiliserais 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 attribuer des privilèges système visibles dans DBA_SYS_PRIVS. Ils peuvent se voir attribuer 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 et peuvent également nécessiter un mot de passe. Par conséquent, le fait qu'un utilisateur se soit vu attribuer un rôle ne signifie pas qu'il peut nécessairement utiliser les privilèges. il a acquis par le rôle par défaut). Mais ces rôles peuvent, à leur tour, se voir attribuer des privilèges système, des privilèges d’objet et des rôles supplémentaires qui peuvent être visualisés en consultant ROLE_SYS_PRIVS, ROLE_TAB_PRIVS et ROLE_ROLE_PRIVS. Le script de Pete parcourt ces relations pour montrer tous les privilèges qui sont accordés à un utilisateur.

18
Justin Cave

Une autre ressource utile:

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

  • DBA_SYS_PRIVS 
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
6
Ageu

Vous pouvez utiliser le code ci-dessous pour obtenir la liste complète des privilèges de tous les utilisateurs.

select * from dba_sys_privs 
1
Ravi Bhushan

Bien que la réponse de Raviteja Vutukuri fonctionne et soit facile à assembler, elle n’est pas particulièrement flexible pour faire varier les filtres et n’aide pas beaucoup si vous souhaitez faire quelque chose par programme. Alors j'ai 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 en fonction de nombreuses informations, telles que l'objet, le privilège, que ce soit par le biais d'un rôle particulier, etc., simplement en modifiant cette clause WHERE.
  • C'est une requête unique, 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 ou non octroyer le privilège et s'il inclut les privilèges pour les sous-objets (la partie "hiérarchique") entre 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 de ce privilège.
  • Il combine les privilèges de table et système en une seule vue cohérente, nous permettant de lister all tous les privilèges d'un utilisateur en un seul coup.
  • C'est un query, pas une fonction qui crache tout cela en 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 fois. Cela facilite le changement.
  • La sous-requête peut facilement être extraite si vous devez l'examiner par chaque personne GRANT.
0
jpmc26

Pour afficher tous les privilèges:

sélectionnez le nom de system_privilege_map;

0
Yerbol Baigarayev