Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Triggers en PostgreSQL
Triggers en PostgreSQL
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Triggers
http://www.postgresql.org
Triggers
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Hemos visto las ventajas que la funciones nos proporcionan al simplicar acciones en nuestra base de datos. Pero estas acciones requieren la intervencin de una persona encargada de ejecutar las funciones cuando se requiera de su actuacin. Los Triggers al contrario son funciones que se ejecutan de forma automtica en respuesta a ciertos eventos que ocurren en la base de datos.
http://www.postgresql.org
Ejecucin de un trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Cuando se ejecuta un trigger? Antes o despus de una insercin (INSERT) Antes o despus de una actualizacin (UPDATE) Antes o despus de un borrado (DELETE)
http://www.postgresql.org
Denicin de un trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
La denicin de un trigger consta de dos partes, 1. La denicin de la funcin asociada al trigger que es la que ejecuta la accin en respuesta al evento (INSERT, UPDATE, DELETE) 2. La denicin formal de trigger que indicar: (a) De que tabla se esperarn los eventos (b) A que tipo de evento se responder
http://www.postgresql.org
Partes de un trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Una funcin tipo trigger es similar a una funcin normal, salvo por unos detalles:
Primero, el tipo de retorno ya no es un tipo normal de PostgreSQL, sino el tipo especial trigger. Segundo, dependiendo de las acciones del trigger, el parmetro en el comando RETURN puede variar, eso lo veremos mas adelante :-)
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Luego de elaborada la funcin trigger, debemos denir formalmente el trigger de este modo:
http://www.postgresql.org
Explicacin
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
CREATE TRIGGER nombretrigger = Creacin del trigger [AFTER | BEFORE ] = Antes o despus del evento [INSERT | UPDATE | DELETE ] = El tipo de evento al que se responder ON nombretabla = De que tabla se esperarn los eventos FOR EACH [ROW | STATEMENT ] = Para cada la o para cada sentencia EXECUTE PROCEDURE funcin = La funcin que se va a ejecutar (con sus parmetros si es que los necesitara)
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Hagamos un ejemplo para ver las cosas un poco mas claras. Tomemos otra vez nuestra tabla item:
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Nuestra tabla item tiene la capacidad de almacenar la informacin mas actual e importante para la tienda de computadoras, pero hay otro tipo de informacin que no es capaz de almacenar (por lo menos por ahora), la informacin del cambio de datos. Nuestra tabla item no tiene memoria de los cambios que han sufrido sus tuplas, si alguien viene y cambia el precio de venta de un artculo, no hay forma de obtener el precio anterior. Si alguien borra un artculo, tampoco sabremos que artculo ha sido borrado ni por quien. Esto nos lleva a la primera gran rea de utilizacin de los triggers, la auditora de tablas.
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Entonces cuales son las acciones que debe realizar nuestro trigger? Necesitamos llevar un registro de todos los cambios relevantes en nuestra tabla item, para empezar queremos tener un seguimiento de los cambios en los precios de los items. Tambin queremos almacenar en algn lugar todos aquellos items que hayan sido eliminados, tambin queremos guardar sus respectivos historiales de cambios.
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Antes de empezar a denir el trigger es necesario conocer una cuantas variables por defecto que nos provee PostgreSQL: current_user = el nombre del usuario que esta actualmente conectado a la base de datos y que ejecuta las sentencias. current_date = La fecha actual (del servidor, no del cliente) current_time = La hora actual
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
PostgreSQL tambin maneja unas cuantas variables al momento de ejecutar un trigger, estas son: NEW = Variable compuesta que almacena los nuevos valores de la tupla que se esta modicando OLD = Variable compuesta que almacena los valores antiguos de la tupla que se esta modicando TG_OP = Variable tipo string que indica que tipo de evento est ocurriendo (INSERT, UPDATE, DELETE) TG_ARGV = Variable tipo arreglo que almacena los parametros de la funcin del trigger, podemos accederlos de la forma TG_ARGV[0], TG_ARGV[1], etc.
http://www.postgresql.org
Tabla adicional
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Como ltimo paso antes de empezar a denir el trigger, debemos crear una tabla que vaya a almacenar los cambios de precio en nuestra tabla item, la llamaremos item_actualizado.
http://www.postgresql.org
Funcin trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
La nombramos con un sujo tri para darnos cuenta que es una funcin perteneciente a un trigger y no confundirla con otra que tengamos en nuestro servidor.
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Listo, cada vez que se actualice una tupla en la tabla item, se reejar el cambio en la tabla item_actualizado. Pero era eso lo que queriamos?, no totalmente, volvamos a la funcin del trigger.
http://www.postgresql.org
Funcin trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Ahora si, solo se insertarn tuplas en la tabla item_actualizado cuando se cambie el valor de precio_venta .
http://www.postgresql.org
Prueba
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
http://www.postgresql.org
Ejercicios
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Ejercicios: A la tabla item_actualizado aadir un atributo hora_cambio que almacene la hora de la modicacin. Hacer otro trigger que haga el mismo tratamiento pero con los items eliminados de la tabla item.
http://www.postgresql.org
Aadiendo la hora
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Modicamos la tabla:
http://www.postgresql.org
Aadiendo la hora
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Modicamos la funcin:
http://www.postgresql.org
Informacin adicional
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Gracias a nuestra nueva tabla item_actualizado ahora podemos obtener mas informacin acerca de nuestra tienda de computadoras. Podemos saber: Que precio tenia cierto tem en cierta temporada Cuanto tiempo se ha mantenido el precio estable En que temporadas del ao los precio caen o se disparan Quienes han modicado los precios de los items
http://www.postgresql.org
Otro trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Ahora hagamos el trigger que haga el seguimiento de los items que han sido eliminados de nuestra tabla item: Primero creamos la tabla item_eliminado:
http://www.postgresql.org
Funcin trigger
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
http://www.postgresql.org
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
http://www.postgresql.org
Problema
Triggers Triggers Ejecucin de un trigger Denicin de un trigger Partes de un trigger Denicin formal del trigger Nuestro primer trigger Que es lo que queremos? Variables del sistema Variables del trigger Funcin trigger Otro trigger
Pero aqu nos surge un problema, solo podremos eliminar items que no tengan sus correspondientes cambios en la tabla item_actualizado, una solucin seria eliminar todo su registro de cambios antes de hacer la eliminacin.
http://www.postgresql.org