¿Cómo mostrar todos los privilegios de un usuario en Oracle?


113

¿Alguien puede decirme cómo mostrar todos los privilegios / reglas de un usuario específico en la consola sql?

Respuestas:


164

Puede probar estas vistas a continuación.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

Los DBA y otros usuarios avanzados pueden encontrar los privilegios otorgados a otros usuarios con las DBA_versiones de estas mismas vistas. Están cubiertos en la documentación .

Esas vistas solo muestran los privilegios otorgados directamente al usuario. Encontrar todos los privilegios, incluidos los otorgados indirectamente a través de roles, requiere declaraciones SQL recursivas más complicadas:

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;

21

Hay varios scripts flotando que lo harán dependiendo de qué tan loco quiera volverse. Yo personalmente usaría el script find_all_privs de Pete Finnigan .

Si desea escribirlo usted mismo, la consulta se vuelve bastante desafiante. Los usuarios pueden obtener privilegios del sistema que son visibles en DBA_SYS_PRIVS. Se les pueden otorgar privilegios de objeto que son visibles en DBA_TAB_PRIVS. Y se les pueden otorgar roles que son visibles en DBA_ROLE_PRIVS(los roles pueden ser predeterminados o no predeterminados y también pueden requerir una contraseña, por lo que el hecho de que a un usuario se le haya otorgado un rol no significa que el usuario necesariamente pueda usar los privilegios que adquirido a través del rol de forma predeterminada). Pero esos papeles pueden, a su vez, ser privilegios concedidos sistema, privilegios de objeto y las funciones adicionales que se pueden ver examinado ROLE_SYS_PRIVS, ROLE_TAB_PRIVSy ROLE_ROLE_PRIVS. El guión de Pete recorre esas relaciones para mostrar todos los privilegios que terminan fluyendo hacia un usuario.


El guión es increíble, acabo de comprobarlo
I.Tyger

1
Necesita privilegios para el paquete UTL_FILE o de lo contrario obtendrá un error al ejecutar el script de Pete Finnigan: "debe declararse el identificador 'UTL_FILE'". Puede conectarse como sys con roll sysdba a través de SQL Developer y luego funcionará o se otorgará a usted mismo privilegios de ejecución para este paquete usando: grant execute on UTL_FILE to <user>;
enero

1
Y para aquellos de nosotros que no tenemos SYSprivilegios y solo queremos ver los privilegios de nuestra propia cuenta, el guión no tiene ningún valor. No tengo acceso a UTL_FILEni a DBA_SYS_PRIVSlas otras áreas DBAy que SYSmira el guión.
vapcguy

No creo ROLE_SYS_PRIVS, ROLE_TAB_PRIVSy ROLE_ROLE_PRIVSnecesita ser examinado. Los documentos indican que son para el usuario actual .
jpmc26

Si alguien tiene una copia de estos scripts, ¿pueden publicar aquí o en algún lugar un poco más perenne como una esencia? El sitio está caído.
Michael Thompson


2

Si bien la respuesta de Raviteja Vutukuri funciona y es rápida de armar, no es particularmente flexible para variar los filtros y no ayuda demasiado si está buscando hacer algo mediante programación. Así que armé mi propia consulta:

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
;

Ventajas:

  • Puedo filtrar fácilmente por una gran cantidad de información diferente, como el objeto, el privilegio, ya sea a través de un rol en particular, etc. simplemente cambiando esa WHEREcláusula.
  • Es una sola consulta, lo que significa que no tengo que componer mentalmente los resultados juntos.
  • Resuelve el problema de si pueden otorgar el privilegio o no y si incluye los privilegios para los subobjetos (la parte "jerárquica") en las diferentes fuentes del privilegio.
  • Es fácil ver todo lo que necesito hacer para revocar el privilegio, ya que enumera todas las fuentes del privilegio.
  • Combina privilegios de tabla y sistema en una única vista coherente, lo que nos permite enumerar todos los privilegios de un usuario de una sola vez.
  • Es una consulta , no una función que arroja todo esto DBMS_OUTPUTo algo (en comparación con el guión vinculado de Pete Finnigan). Esto lo hace útil para uso programático y para exportar.
  • El filtro no se repite; solo aparece una vez. Esto facilita el cambio.
  • La subconsulta se puede extraer fácilmente si necesita examinarla por cada individuo GRANT.

Algunas tareas pendientes para mí: 1. Agregar indicador si el usuario puede otorgar el privilegio otorgando un rol a otro usuario. 2. Descubra cómo hacer esto para el usuario actual sin privilegios de DBA. Probablemente involucra USER_SYS_PRIVS(privilegios del sistema otorgados directamente), USER_TAB_PRIVS( privilegios de objeto otorgados directamente) USER_ROLE_PRIVS(roles otorgados directamente por el usuario), ROLE_ROLE_PRIVS(para obtener roles heredados), ROLE_SYS_PRIVS(privilegios del sistema a través de roles) y ROLE_TAB_PRIVS(privilegios de objeto a través de roles). Ugh. Oracle es tan complicado.
jpmc26

1

Puede usar el siguiente código para obtener toda la lista de privilegios de todos los usuarios.

select * from dba_sys_privs 

Esto no enumera todos los privilegios. Como lo demuestran varias otras respuestas que precedieron a la suya por años , omite los privilegios de mesa y todos los privilegios otorgados a través de roles.
jpmc26

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.