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>UNIONSELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON(rp.granted_role = rsp.role)WHERE rp.grantee =<theUser>ORDERBY1;
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>ORDERBY owner, table_name;
Subvenciones indirectas a mesas / vistas:
SELECTDISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON(rp.granted_role = rtp.role)WHERE rp.grantee =<theUser>ORDERBY owner, table_name;
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.
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 currentuseris the grantee
Object grants for which an enabled role orPUBLICis 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:
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.
selectdistinct'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 NameOR RP.GRANTEE in('YOUR USER'))--Change User Nameand RP.GRANTEE notin('SYS','SYSTEM');
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
role_role_privs
mesa y luegoCONNECT BY PRIOR granted_role = role
recurrir a los privilegios de rol transitivo ...Suponiendo que desea enumerar las subvenciones en todos los objetos que ha recibido un usuario en particular :
Esto no devolverá objetos que sean propiedad del usuario. Si los necesita, use
all_tab_privs
view en su lugar.fuente
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,
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:
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:
Tenga en cuenta que no hay una vista DBA_TAB_PRIVS_RECD en Oracle.
fuente
El método más completo y confiable que conozco sigue siendo el uso de DBMS_METADATA :
Aunque interesantes respuestas.
fuente
fuente
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
fuente