Respuestas:
Si desea algo más que concesiones de tabla directas (por ejemplo, concesiones a través de roles, privilegios del sistema como seleccionar cualquier tabla, etc.), aquí hay algunas consultas adicionales:
Privilegios del sistema para un usuario:
SELECT PRIVILEGE
FROM sys.dba_sys_privs
WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
WHERE rp.grantee = <theUser>
ORDER BY 1;
Subvenciones directas a mesas / vistas:
SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv
FROM table_privileges
WHERE grantee = <theUser>
ORDER BY owner, table_name;
Subvenciones indirectas a mesas / vistas:
SELECT DISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
WHERE rp.grantee = <theUser>
ORDER BY owner, table_name;
role_role_privs
mesa y luego CONNECT BY PRIOR granted_role = role
recurrir a los privilegios de rol transitivo ...
Lo siento chicos, pero seleccionar de all_tab_privs_recd donde grantee = 'your user' no dará ningún resultado excepto las subvenciones públicas y las subvenciones de usuario actual si ejecuta la selección desde un usuario diferente (digamos, SYS). Como dice la documentación,
ALL_TAB_PRIVS_RECD describe los siguientes tipos de subvenciones:
Object grants for which the current user is the grantee Object grants for which an enabled role or PUBLIC is the grantee
Por lo tanto, si es un DBA y desea enumerar todas las concesiones de objetos para un usuario en particular (no SYS en sí), no puede usar esa vista del sistema.
En este caso, debe realizar una consulta más compleja. Aquí hay uno tomado (rastreado) de TOAD para seleccionar todas las concesiones de objetos para un usuario en particular:
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
11, 'PACKAGE BODY', 12, 'TRIGGER',
13, 'TYPE', 14, 'TYPE BODY',
19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
32, 'INDEXTYPE', 33, 'OPERATOR',
34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
42, 'MATERIALIZED VIEW',
43, 'DIMENSION',
44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
48, 'CONSUMER GROUP',
51, 'SUBSCRIPTION', 52, 'LOCATION',
55, 'XML SCHEMA', 56, 'JAVA DATA',
57, 'EDITION', 59, 'RULE',
62, 'EVALUATION CONTEXT',
'UNDEFINED') object_type,
o.name object_name,
'' column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.col# is null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
o.name object_name,
c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.obj# = c.obj#
and oa.col# = c.col#
and bitand(c.property, 32) = 0 /* not hidden column */
and oa.col# is not null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 42)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0;
Esto enumerará todas las concesiones de objetos (incluidas las concesiones de columna) para su usuario (especificado). Si no desea subvenciones a nivel de columna, elimine toda la parte de la selección que comience con la cláusula 'unión'.
UPD: Al estudiar la documentación encontré otra vista que enumera todas las subvenciones de una manera mucho más sencilla:
select * from DBA_TAB_PRIVS where grantee = 'your user';
Tenga en cuenta que no hay una vista DBA_TAB_PRIVS_RECD en Oracle.
El método más completo y confiable que conozco sigue siendo el uso de DBMS_METADATA :
select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;
Aunque interesantes respuestas.
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP
on (RP.GRANTED_ROLE = RTP.role)
where (OWNER in ('YOUR USER') --Change User Name
OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;
La siguiente consulta se puede utilizar para obtener todos los privilegios de un usuario. Simplemente proporcione el nombre de usuario en la primera consulta y obtendrá todos los privilegios para eso.
CON los usuarios AS (SELECCIONAR 'SCHEMA_USER' usr DE dual), Roles AS (SELECCIONAR rol_concedido DE dba_role_privs rp ÚNETE a los usuarios EN rp.GRANTEE = users.usr SELECCIONAR UNIÓN rol_concedido DE role_role_privs DONDE rol ENTRAR (SELECCIONAR rol otorgado DE dba_roles JOIN_privs rp. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp JOIN roles r ON rtp.role = r.granted_role UNION SELECCIONAR PROPIETARIO, TABLE_NAME, PRIVILEGE FROM Dba_Tab_Privs dtp.Usuarios UNIRSE. usr), sys_privileges AS (SELECT privilege FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges