¿Cómo puedo enumerar TODAS las subvenciones que recibió un usuario?

97

Necesito ver todas las subvenciones en una base de datos de Oracle.

Usé la función TOAD para comparar esquemas pero no muestra concesiones tentables, etc., así que ahí está mi pregunta:

¿Cómo puedo enumerar todas las subvenciones en una base de datos de Oracle?

guerda
fuente

Respuestas:

141

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;
DCookie
fuente
1
Es posible que no tenga derecho a ver la tabla sys.dba_sys_privs.
Hannes
1
Absolutamente correcto. Consulte a su DBA. Si se niegan, es posible que tengan preocupaciones legítimas de seguridad. Ver el contenido de estas vistas le da al usuario información que no podría tener de otra manera.
DCookie
2
Sería interesante unirse a la izquierda a la role_role_privsmesa y luego CONNECT BY PRIOR granted_role = rolerecurrir a los privilegios de rol transitivo ...
Lukas Eder
33

Suponiendo que desea enumerar las subvenciones en todos los objetos que ha recibido un usuario en particular :

select * from all_tab_privs_recd where grantee = 'your user'

Esto no devolverá objetos que sean propiedad del usuario. Si los necesita, use all_tab_privsview en su lugar.

Juris
fuente
20

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.

Alex Cherkas
fuente
12

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.

Matteo Steccolini
fuente
5
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')
;
Sujit
fuente
7
Alguna explicación ayudaría a esta respuesta, para cuando otras personas vengan y la encuentren.
Andrew Barber
0

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

Pradeep Dewani
fuente