Grants para consultar user_scheduler_job_run_details y user_SCHEDULER_JOBS

Hola,

Quiero migrar los jobs de mi bdd al paquete scheduler de Oracle porque me parece  mucho más facil de manejar. Como parte de la mejora de gestión de jobs, querría que los usuarios que pertenecen a un determinado rol de mi bdd (r_desa) puedan consultar las tablas: user_scheduler_job_run_details user_SCHEDULER_JOBS.

 

Estos usuarios son desarrolladores (el rol se llama R_DESA) y quiero que cuando fallen los procedimientos que ejecutan los jobs del scheduler puedan ver qué ha pasado. Para eso he creado esta vista con los datos que quiero que puedan ver:

SELECT to_char(d.log_date, 'dd/mm/yyyy hh24:mi:ss') as FECHA_EJECUCION, d.job_name as NOMBRE_JOB, job_action as DETALLE_JOB,i.state as ESTADO, d.status as RESULTADO, d.ERROR# as SQL_CODE, d.additional_info as DETALLE_EJECUCION, d.CPU_USED as USO_CPU, to_char(i.next_run_date, 'dd/mm/yyyy hh24:mi:ss') as FECHA_PROXIMA_EJECUCION FROM user_scheduler_job_run_details d, user_SCHEDULER_JOBS i where i.job_name = d.job_name ORDER BY log_date desc

He dado estos permisos al rol: grant select on VW_LOG_EJECUCIONES_JOBS_core to r_desa

Pero al hacer la select con un usuario que pertenece al rol R_desa, la vista siempre está vacía ..

Hay alguna forma de que un usuario que no tenga el grant MANAGE SCHEDULER pueda ver las tablas que les indico?

Muchas gracias 

 

Hay algo mal en el post, no? Supongo que la select está dentro de un CREATE OR REPLACE VIEW.

Creo que tu problema está en que has asignado permisos para consultar la vista, pero el rol no debe tener permisos de consulta sobre las tablas que utiliza la vista.

Prueba haciendo también un GRANT sobre user_scheduler_job_run_details y sobre user_SCHEDULER_JOBS.

Hola,

Efectivamente la vista es esta:

CREATE OR REPLACE VIEW VW_LOG_EJECUCIONES_JOBS_CORE AS SELECT to_char(d.log_date, 'dd/mm/yyyy hh24:mi:ss') as FECHA_EJECUCION, d.job_name as NOMBRE_JOB, job_action as DETALLE_JOB,i.state as ESTADO, d.status as RESULTADO, d.ERROR# as SQL_CODE, d.additional_info as DETALLE_EJECUCION, d.CPU_USED as USO_CPU, to_char(i.next_run_date, 'dd/mm/yyyy hh24:mi:ss') as FECHA_PROXIMA_EJECUCION FROM user_scheduler_job_run_details d, user_SCHEDULER_JOBS i where i.job_name = d.job_name ORDER BY log_date desc

He probado estos grants:

grant select on VW_LOG_EJECUCIONES_JOBS_CORE to r_desa

Y también:

grant select on user_scheduler_job_run_details to r_desa grant select on user_SCHEDULER_JOBS to r_desa

Ambos me muestran la vista vacía. La única forma que he encontrado de poder consultar las tablas es siendo el usuario propietario del job o teniendo los permisos: MANAGE SCHEDULER. Pero esto último me parece peligroso porque también permite borrar y crear nuevos jobs.

No se si hay alguna forma elegante de volcar la informacion de la vista a un otro objeto al que sí pueda dar permisos. El problema sería que no sería informacion actualizada...

Gracias

En respuesta a por LPL

Y si en lugar de utilizar la vista haces la select con ese usuario?

Si con el propietario del job te muestra datos y con el otro usuario no te muestra nada es que no estás viendo lo mismo.

Si fuera un problema de permisos te devolvería un error de privilegios de acceso, no tablas vacías.

Para asegurarte de que accedes al mismo objeto, utiliza el nombre del esquema propietario de las tablas para acceder a ellas:

select ... from propietario.user_scheduler_job_run_details, propietario.user_SCHEDULER_JOBS where ...

 

Hola,

Muchas gracias otra vez, lo he probado:

CREATE OR REPLACE VIEW VW_LOG_EJECUCIONES_JOBS_CORE AS
SELECT to_char(d.log_date, 'dd/mm/yyyy hh24:mi:ss') as FECHA_EJECUCION,
d.job_name as NOMBRE_JOB, job_action as DETALLE_JOB,i.state as ESTADO,
d.status as RESULTADO,
d.ERROR# as SQL_CODE,
d.additional_info as DETALLE_EJECUCION,
d.CPU_USED as USO_CPU,
to_char(i.next_run_date, 'dd/mm/yyyy hh24:mi:ss') as FECHA_PROXIMA_EJECUCION
FROM sys.user_scheduler_job_run_details d, sys.user_SCHEDULER_JOBS i
where i.job_name = d.job_name
ORDER BY log_date desc

grant select on VW_LOG_EJECUCIONES_JOBS_CORE to r_desa;

Y sigue sin devolver datos.. Al ser tablas de sistema, parece que su comportamiento es diferente.

En respuesta a por LPL

Creo que ya tengo una explicación para lo que te pasa.

Primero, los objetos de sistema USER_SCHEDULER_JOBS y USER_SCHEDULER_JOB_RUN_DETAILS no son tablas, son vistas del sistema.

Consultando la definición de estas vistas, en el where se incluye una condición como esta:

AND e.owner = SYS_CONTEXT('USERENV','CURRENT_SCHEMA')

Esto nos da una pista sobre el 'misterio de las vistas vacías'. No es un problema de permisos, un tema de contexto. 

Estas vistas muestran los jobs del usuario que lanza la consulta, no de todos los usuarios.

Por eso cuando haces la consulta con el usuario propietario te muestra los jobs, y con otro usuario que no tiene jobs no te muestra nada.

Para consultar los jobs de otro usuario podrías intentar crear una vista parecida, y en lugar de esta condición indicar el usuario owner del que te interesa consultar los jobs, o trabajar directamente sobre la tabla sys.SCHEDULER$_JOB, que parece que es la que almacena información de todos los jobs.