ORACLE: ejecutar procedimiento y paquetes con el usuario actual

Si creamos un procedimiento o paquete con un usuario (UsuarioDueno), y le damos permisos de ejecución a otros (UsuarioAutorizado), el procedimiento se ejecuta por defecto como si lo ejecutase  el  UsuarioDueño.

Ej, supongamos que tenemos un procedimiento que cuenta las tablas del usuario  ( select count(*) from user_tables ) y nos devuelve un número:

create or replace function cuenta return integer is
  salida integer;
begin
  execute immediate 'select count(*) from user_tables' into salida;
  return salida;
end;
/

Y le damos permisos de ejecucion a UsuarioAutorizado:
grant execute on cuenta  to UsuarioAutorizado;

Si ejecutamos el procedimiento:
set serveroutput on;
declare
  tablas integer;
begin
  tablas := cuenta();
  dbms_output.put_line(tablas);
end;
/
Tanto si lo hacemos como UsuarioDueno como UsuarioAutorizado nos saldrá el mismo número de tablas. Esto es a que siempre se accede a UsuarioDueno.user_tables, cuando lo que en realidad queremos es que se acceda a  UsuarioAutorizado, que es nuestro usuario actual (current user) y el usuario que está ejecutando.

En Oracle, hay dos clausulas para controlar el comportamiento:
AUTHID CURRENT_USER  : ejecutar el paquete/función como si fueses el usuario que lo lanza.
AUTHID DEFINER (valor por defecto): ejecutar el procedimiento con los permisos del creador de la función.


Nosotros en este caso tenemos que decir que se ejecute como AUTHID CURRENT_USER. Para ello definimos de nuevo la función, añadiendo:

create or replace function cuenta return integer AUTHID CURRENT_USER is
  salida integer;
begin
  execute immediate 'select count(*) from user_tables' into salida;
  return salida;
end;
/

Si estamos con un paquete, hacemos lo mismo y lo definimos justo antes del "as":

create or replace package contador AUTHID CURRENT_USER  as
      FUNCTION cuenta RETURN integer;
end contador
/
Con esto conseguirmos que un procedimiento se ejecute con otro usuario, el usuario actual, el que ejecuta programa.


1 comentario:

Cedrus dijo...

Gracias troesma lince!