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.


Comentarios

Cedrus ha dicho que…
Gracias troesma lince!

Entradas populares de este blog

Compilar php 4.4 con ldap en centOs

Oracle : Tablas y objetos bloqueados