Vous êtes sur la page 1sur 18

PROCEDIMIENTOS ALMACENADOS. TRIGGERS.

Administracion de Base de Datos en Postgresql

PROCEDIMIENTOS ALMACENADOS

En PostgreSql a diferencia de otros motores de bases de datos, no existe una distincin explicita entre una funcin y un procedimiento almacenado. En PostgreSql solo existen funciones, claro que estas pueden ser usadas a modo de una funcin o de un procedimiento almacenado. Adems de esta diferencia con otros motores de bases de datos, es importante mencionar que PostgreSql nos ofrece ms de un lenguaje para crear nuestros procedimientos almacenados, pudiendo elegir entre los siguientes lenguajes: PL/PgSQL, C, C++, Java PL/Java web, PL/Perl., plPHP, PL/Python, PL/Ruby, PL/sh, PL/Tcl, PL/Scheme.

VENTAJAS.

La ejecucin del procedimiento ocurre en el servidor de bases de datos. Esto probablemente aumentar el rendimiento de nuestra aplicacin al no tenerse que mandar datos entre el cliente y el servidor, y no tener que procesar resultados intermedios en el cliente para obtener el resultado final. Al tener la lgica de la aplicacin implementada en la base de datos no tendremos que implementarla en los clientes, con el consiguiente ahorro de lneas de cdigo redundante y complejidad. Si tenemos diferentes tipos de clientes implementados en diferentes sistemas o lenguajes de programacin y accediendo a la misma base de datos, no tendremos que programar la misma lgica en todos, al estar est disponible en la base de datos. Tendremos una API a la lgica de la aplicacin lista para usarse desde diferentes clientes

PROCEDIMIENTO EN

PL/PGSQL

CREATE [ OR REPLACE ] FUNCTION nombre_funcion([ [ argmodo ] [ argnombre ] argtipo [, ...] ]) RETURNS tipo AS $$ [ DECLARE ] [ declaraciones de variables ] BEGIN codigo END; $$ LANGUAGE plpgsql | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COST execution_cost | ROWS result_rows | SET configuration_parameter { TO value | = value | FROM CURRENT };

PROCEDIMIENTO EN

PL/PGSQL

argmodo: El modo de un argumento puede ser IN, OUT, or INOUT. Por defecto se usa IN si no se define. argtipo: Los tipos que podemos utilizar son todos los disponibles en PostgreSQL y todos los definidos por el usuario Declaraciones de variables: Las declaraciones de variables se pueden realizar de la siguiente manera ($n = orden de declaracin del argumento.):

PROCEDIMIENTO EN

PL/PGSQL

IMMUTABLE | STABLE | VOLATILE: .- IMMUTABLE: Indica que la funcin no puede alterar a la base de datos y que siempre devolver el mismo resultado, dados los mismos valores como argumentos. Este tipo de funciones no pueden realizar consultas en la base de datos. .- STABLE: Indica que la funcin no puede alterar a la base de datos y que siempre devolver el mismo resultado en una consulta individual de una tabla, dados los mismos valores como argumentos. El resultado podra cambiar entre sentencias SQL. .- VOLATILE: Indica que la funcin puede devolver diferentes valores, incluso dentro de una consulta individual de una tabla (valor por defecto)

PROCEDIMIENTO EN

PL/PGSQL

CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT: .- CALLED ON NULL INPUT: Indica que la funcin se ejecutar aunque algunos de los argumentos sean NULL. El usuario tiene la responsabilidad de comprobar si algn argumento es NULL cuando sea necesario tener esto en cuenta.(valor por defecto) .- RETURNS NULL ON NULL INPUT / STRICT: Indican que la funcin no se ejecutar y devolver el valor NULL si alguno de los argumentos es NULL.

PROCEDIMIENTO EN

PL/PGSQL

SECURITY INVOKER | SECURITY DEFINER: .- SECURITY INVOKER: Indica que la funcin se ejecutar con los privilegios del usuario que la ejecuta (valor por defecto) .- SECURITY DEFINER: Indica que la funcin se ejecutar con los privilegios del usuario que la creo.

DISPARADORES O TRIGGER.

Un disparador no es otra cosa que una accin definida en una tabla de nuestra base de datos y ejecutada automticamente por una funcin programada por nosotros. Esta accin se activar, segn la definamos, cuando realicemos un INSERT, un UPDATE un DELETE en la susodicha tabla

DEFINICIN DE UN TRIGGER

Un disparador se puede definir de las siguientes maneras:


Para que ocurra ANTES de cualquier INSERT,UPDATE DELETE Para que ocurra DESPUES de cualquier INSERT,UPDATE DELETE Para que se ejecute una sola vez por comando SQL (statement-level trigger) Para que se ejecute por cada linea afectada por un comando SQL (row-level trigger)

DEFINICIN DE UN TRIGGER

Esta es la definicin del comando SQL que se puede utilizar para definir un disparador en una tabla.

CREATE TRIGGER nombre { BEFORE | AFTER } { INSERT | UPDATE | DELETE [ OR ... ] } ON tabla [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE nombre de funcin ( argumentos )

Antes de definir el disparador tendremos que definir el procedimiento almacenado que se ejecutar cuando nuestro disparador se active.

CARACTERSTICAS Y REGLAS A SEGUIR

El procedimiento almacenado que se vaya a utilizar por el disparador debe de definirse e instalarse antes de definir el propio disparador.
Un procedimiento que se vaya a utilizar por un disparador no puede tener argumentos y tiene que devolver el tipo "trigger". Un mismo procedimiento almacenado se puede utilizar por mltiples disparadores en diferentes tablas.

Procedimientos almacenados utilizados por disparadores que se ejecutan una sola vez per comando SQL (statement-level) tienen que devolver siempre NULL.
Procedimientos almacenados utilizados por disparadores que se ejecutan una vez per linea afectada por el comando SQL (rowlevel) pueden devolver una fila de tabla.

CARACTERSTICAS Y REGLAS A SEGUIR

Procedimientos almacenados utilizados por disparadores que se ejecutan una vez per fila afectada por el comando SQL (row-level) y ANTES de ejecutar el comando SQL que lo lanz, pueden:

Retornar NULL para saltarse la operacin en la fila afectada. devolver una fila de tabla (RECORD)

Procedimientos almacenados utilizados por disparadores que se ejecutan DESPUES de ejecutar el comando SQL que lo lanz, ignoran el valor de retorno, asi que pueden retornar NULL sin problemas. En resumen, independientemente de como se defina un disparador, el procedimiento almacenado utilizado por dicho disparador tiene que devolver bien NULL, bien un valor RECORD con la misma estructura que la tabla que lanz dicho disparador.

CARACTERSTICAS Y REGLAS A SEGUIR

Si una tabla tiene ms de un disparador definido para un mismo evento (INSERT,UPDATE,DELETE), estos se ejecutarn en orden alfabtico por el nombre del disparador. En el caso de disparadores del tipo ANTES / row-level, la file retornada por cada disparador, se convierte en la entrada del siguiente. Si alguno de ellos retorna NULL, la operacin ser anulada para la fila afectada.
Procedimientos almacenados utilizados por disparadores pueden ejecutar sentencias SQL que a su vez pueden activar otros disparadores. Esto se conoce como disparadores en cascada. No existe lmite para el nmero de disparadores que se pueden llamar pero es responsabilidad del programador el evitar una recursin infinita de llamadas en la que un disparador se llame asi mismo de manera recursiva.

VARIABLES ESPECIALES EN PL/PGSQL

Cuando una funcin escrita en PL/pgSQL es llamada por un disparador tenemos ciertas variable especiales disponibles en dicha funcin. Estas variables son las siguientes:
NEW Tipo de dato RECORD; Variable que contiene la nueva fila de la tabla para las operaciones INSERT/UPDATE en disparadores del tipo row-level. Esta variable es NULL en disparadores del tipo statement-level. OLD Tipo de dato RECORD; Variable que contiene la antigua fila de la tabla para las operaciones UPDATE/DELETE en disparadores del tipo row-level. Esta variable es NULL en disparadores del tipo statement-level. TG_NAME Tipo de dato name; variable que contiene el nombre del disparador que est usando la funcin actualmente.

VARIABLES ESPECIALES EN PL/PGSQL


TG_WHEN Tipo de dato text; una cadena de texto con el valor BEFORE o AFTER dependiendo de como el disparador que est usando la funcin actualmente ha sido definido. TG_LEVEL Tipo de dato text; una cadena de texto con el valor ROW o STATEMENT dependiendo de como el disparador que est usando la funcin actualmente ha sido definido TG_OP Tipo de dato text; una cadena de texto con el valor INSERT, UPDATE o DELETE dependiendo de la operacin que ha activado el disparador que est usando la funcin actualmente. TG_RELID Tipo de dato oid; el identificador de objeto de la tabla que ha activado el disparador que est usando la funcin actualmente.

VARIABLES ESPECIALES EN PL/PGSQL

TG_RELNAME Tipo de dato name; el nombre de la tabla que ha activado el disparador que est usando la funcin actualmente. Esta variable es obsoleta y puede desaparacer en el futuro. Usar TG_TABLE_NAME. TG_TABLE_NAME Tipo de dato name; el nombre de la tabla que ha activado el disparador que est usando la funcin actualmente. TG_TABLE_SCHEMA Tipo de dato name; el nombre de la schema de la tabla que ha activado el disparador que est usando la funcin actualmente. TG_NARGS Tipo de dato integer; el nmero de argumentos dados al procedimiento en la sentencia CREATE TRIGGER. TG_ARGV[] Tipo de dato text array; los argumentos de la sentencia CREATE TRIGGER. El ndice empieza a contar desde 0. Indices invlidos (menores que 0 mayores/iguales que tg_nargs) resultan en valores nulos.

EJEMPLO CON LA BASE DE DATOS BDVENTAS.


--1.- Implementando una funcion Create or replace function fn_disminuyestock() returns trigger as $$ Declare Begin update Producto set stock=stock-new.cantidad where idproducto=new.idproducto; return new; end; $$ language 'plpgsql'; --2.- Enlazando la funcion al evento(eliminar, insertar, modificar) Create trigger tr_disminuyestock after insert on detalleventa for each row execute procedure fn_disminuyestock();

Vous aimerez peut-être aussi