Authid en programas almacenados

¿Se han topado con el problema de tener muchos esquemas o usuarios distintos que contienen programas almacenados como stored procedures, que son similares a través de los mismos esquemas generando más trabajo por tener que estar actualizando cuando hay cambios, todos los programas en dichos esquemas? Si la respuesta es afirmativa, entonces son candidatos al uso del authid.

¿Qué es el Authid?

La cláusula AUTHID, al ser incluida en programas almacenados, determina con qué derechos se ejecutará cada programa sobre los objetos en los que aplica. Dicha cláusula aplica en los siguientes objetos:

FUNCTION
PROCEDURE
PACKAGE
TYPE

Dicha cláusula tiene dos opciones: CURRENT_USER y DEFINER. La primera, determina que cuando se ejecute el objeto que está siendo llamado, lo hará sobre la información del usuario que la está ejecutando actualmente. La otra opción es la típica en la cual, cuando se ejecuta un programa, se hace con los objetos e información del usuario propietario (owner).

Al usar la opción de CURRENT_USER, podremos tener todos los programas almacenados en un solo lugar y ejecutarlos desde distintos usuarios sobre la información de cada usuario.

Sintaxis

La sintaxis para los distintos objetos es:

Function

create [or replace] function [propietario.]nombre_función
return tipo_datos [authid current_user|definer] is...

Para mayor información, se puede ver la sintaxis completa.

Procedure

create [or replace] procedure [propietario.]nombre_procedimiento
[authid current_user|definer] is...

Para mayor información, se puede ver la sintaxis completa.

Package

create [or replace] package [propietario.]nombre_paquete
[authid current_user|definer] is...

Para mayor información, se puede ver la sintaxis completa.

Type

create [or replace] type [propietario.]nombre_tipo
[authid current_user|definer] is...

Para mayor información, se puede ver la sintaxis completa.

Ejemplo práctico

Ok, veamos ahora  un ejemplo claro de cómo aplicar el AUTHID a los programas almacenados. Primero vamos a crear un esquema llamado prueba_authid:

SQL> create user prueba_authid identified by prueba
  2  default tablespace datos
  3  temporary tablespace temp;
User created.
SQL> grant connect, resource to prueba_authid;
Grant succeeded.
SQL> conn prueba_authid/prueba;
Connected.

en él, se crea un procedimiento llamado muestra_datos_1 normal. En ese mismo esquema y el esquema prueba que ya existe en mi base de datos personal, se crea la tabla datos con distinta información:

SQL> create table datos (
  2    descripcion varchar2(50)
  3  );
Table created.
SQL> insert into datos values ('PRUEBA_AUTHID');
1 row created.
SQL> create or replace procedure muestra_datos_1
  2  is
  3    ls_descripcion datos.descripcion%type;
  4  begin
  5    select descripcion
  6    into   ls_descripcion
  7    from   datos;
  8
  9    dbms_output.put_line (ls_descripcion);
 10  end;
 11  /
Procedure created.
SQL> exec muestra_datos_1
PRUEBA_AUTHID
PL/SQL procedure successfully completed.
SQL> conn prueba/prueba
Connected.
SQL> create table datos (
  2    descripcion varchar2(50)
  3  );
Table created.
SQL> insert into datos values ('PRUEBA');
1 row created.
SQL> conn prueba_authid/prueba
Connected.
SQL> grant execute on muestra_datos_1 to prueba;
Grant succeeded.
SQL> conn prueba/prueba
Connected.
SQL> exec prueba_authid.muestra_datos_1
PRUEBA_AUTHID
PL/SQL procedure successfully completed.

Como se puede observar, al ejecutar el programa muestra_datos_1 desde el usuario prueba, se ve la información que contiene la tabla datos pero del usuario prueba_authid. Ahora veamos lo mismo, pero incluyendo la cláusula authid:

SQL> conn prueba_authid/prueba
Connected.
SQL> create or replace procedure muestra_datos_2
  2  authid current_user is
  3    ls_descripcion datos.descripcion%type;
  4  begin
  5    select descripcion
  6    into   ls_descripcion
  7    from   datos;
  8
  9    dbms_output.put_line (ls_descripcion);
 10  end;
 11  /
Procedure created.
SQL> grant execute on muestra_datos_2 to prueba;
Grant succeeded.
SQL> exec muestra_datos_2
PRUEBA_AUTHID
PL/SQL procedure successfully completed.
SQL> conn prueba/prueba
Connected.
SQL> exec prueba_authid.muestra_datos_2
PRUEBA
PL/SQL procedure successfully completed.

De esta forma, se puede ver que ahora sí, no importa que se esté ejecutando el programa muestra_datos_2 desde otro usuario, lo hace sobre los objetos del usuario que lo está llamando, en este caso prueba.

Para facilitar más las cosas, vamos a crear un sinónimo público para dicho procedimiento:

SQL> conn / as sysdba
Connected.
SQL> grant create public synonym to prueba_authid;
Grant succeeded.
SQL> conn prueba_authid/prueba
Connected.
SQL> create public synonym muestra_datos for muestra_datos_2;
Synonym created.
SQL> exec muestra_datos
PRUEBA_AUTHID
PL/SQL procedure successfully completed.
SQL> conn prueba/prueba
Connected.
SQL> exec muestra_datos
PRUEBA
PL/SQL procedure successfully completed.

De esta forma, como se puede ver, tendremos en un sólo esquema todos los programas almacenados con una única copia. Para dar mantenimiento a los programas, nada más vamos a un sólo lugar para hacerlo. Interesante ¿no?

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

2 Responses to Authid en programas almacenados

  1. Emanuel says:

    Increíble la manera en la que explicas este tema!!! Tengo en mis manos el manual oficial Oracle Database 11g: Desarrollo de Unidades de Programa PL/SQL y no lo explica de este modo, es más, solo toma una página explicar el tema sin dar ejemplos ni información relevante sobre DEFINER y CURRENT_USER. Agradezco que hayas creado este post. Saludos desde Argentina.

  2. Orlando Olguín Olvera says:

    Hola Emmanuel.

    Gracias por tus comentarios.

    Orlando.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: