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;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.
declare
tablas integer;
begin
tablas := cuenta();
dbms_output.put_line(tablas);
end;
/
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 asCon esto conseguirmos que un procedimiento se ejecute con otro usuario, el usuario actual, el que ejecuta programa.
FUNCTION cuenta RETURN integer;
end contador
/
1 comentario:
Gracias troesma lince!
Publicar un comentario