Respuestas:
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;
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_PRIVS
y ROLE_ROLE_PRIVS
. El guión de Pete recorre esas relaciones para mostrar todos los privilegios que terminan fluyendo hacia un usuario.
SYS
privilegios y solo queremos ver los privilegios de nuestra propia cuenta, el guión no tiene ningún valor. No tengo acceso a UTL_FILE
ni a DBA_SYS_PRIVS
las otras áreas DBA
y que SYS
mira el guión.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
y ROLE_ROLE_PRIVS
necesita ser examinado. Los documentos indican que son para el usuario actual .
DBA
o SYS
, y solo desea encontrar los privilegios de su propia cuenta.
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:
WHERE
cláusula.DBMS_OUTPUT
o algo (en comparación con el guión vinculado de Pete Finnigan). Esto lo hace útil para uso programático y para exportar.GRANT
.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.
Puede usar el siguiente código para obtener toda la lista de privilegios de todos los usuarios.
select * from dba_sys_privs
Para mostrar todos los privilegios:
seleccione el nombre de system_privilege_map;