You are on page 1of 27

GoBack

PostgreSQL Módulo 1 - Triggers

Rodrigo Soliz Rocabado (rodrifer@gmail.com)

June 14, 2007

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 1
Triggers

Triggers

Ejecución de un trigger

Definición de un trigger

Partes de un trigger

Definición formal del trigger

Nuestro primer trigger

Que es lo que queremos?

Variables del sistema

Variables del trigger
Triggers
Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 2
Triggers

Triggers
Hemos visto las ventajas que la funciones nos proporcionan al simplificar acciones en
Triggers

Ejecución de un trigger
nuestra base de datos.
Definición de un trigger Pero estas acciones requieren la intervención de una persona encargada de ejecutar las
Partes de un trigger funciones cuando se requiera de su actuación.
Definición formal del trigger
Los Triggers al contrario son funciones que se ejecutan de forma automática en respuesta
Nuestro primer trigger

Que es lo que queremos?
a ciertos eventos que ocurren en la base de datos.
Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 3
Ejecución de un trigger

Triggers
Cuando se ejecuta un trigger?
Triggers

Ejecución de un trigger
 Antes o después de una inserción (INSERT)
Definición de un trigger

Partes de un trigger

Definición formal del trigger
 Antes o después de una actualización (UPDATE)
Nuestro primer trigger

Que es lo que queremos?  Antes o después de un borrado (DELETE)
Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 4
Definición de un trigger

Triggers
La definición de un trigger consta de dos partes,
Triggers

Ejecución de un trigger
1. La definición de la función asociada al trigger que es la que ejecuta la acción en
Definición de un trigger

Partes de un trigger
respuesta al evento (INSERT, UPDATE, DELETE)
Definición formal del trigger

Nuestro primer trigger 2. La definición formal de trigger que indicará:
Que es lo que queremos?

Variables del sistema (a) De que tabla se esperarán los eventos
Variables del trigger

Función trigger (b) A que tipo de evento se responderá
Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 5
Partes de un trigger

Triggers
Una función tipo trigger es similar a una función normal, salvo por unos detalles:
Triggers

Ejecución de un trigger CREATE OR REPLACE FUNCTION nombrefuncion (param, param)
Definición de un trigger RETURNS trigger
Partes de un trigger AS $$
Definición formal del trigger DECLARE
Nuestro primer trigger variable ;
Que es lo que queremos? variable ;
Variables del sistema
BEGIN
Variables del trigger
sentencia ;
sentencia ;
RETURN retorno ;
Función trigger

Otro trigger
END;
$$
Language 'plpgsql';

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 parámetro en el comando RETURN
puede variar, eso lo veremos mas adelante :-)

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 6
Definición formal del trigger

Triggers
Luego de elaborada la función trigger, debemos definir formalmente el trigger de este
Triggers

Ejecución de un trigger
modo:
Definición de un trigger
CREATE OR REPLACE TRIGGER nombretrigger
Partes de un trigger
[AFTER | BEFORE] [INSERT | UPDATE | DELETE]
Definición formal del trigger
ON nombretabla
Nuestro primer trigger FOR EACH [ROW | STATEMENT]
Que es lo que queremos? EXECUTE PROCEDURE funcion ;
Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 7
Explicación

Triggers
CREATE TRIGGER nombretrigger = Creación del trigger
Triggers

Ejecución de un trigger
[AFTER | BEFORE ] = Antes o después del evento
Definición de un trigger

Partes de un trigger

Definición formal del trigger
[INSERT | UPDATE | DELETE ] = El tipo de evento al que se responderá
Nuestro primer trigger

Que es lo que queremos? ON nombretabla = De que tabla se esperarán los eventos
Variables del sistema

Variables del trigger FOR EACH [ROW | STATEMENT ] = Para cada fila o para cada sentencia
Función trigger

Otro trigger EXECUTE PROCEDURE función = La función que se va a ejecutar (con sus parámetros
si es que los necesitara)

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 8
Nuestro primer trigger

Triggers
Hagamos un ejemplo para ver las cosas un poco mas claras. Tomemos otra vez nuestra
Triggers
tabla item:
Ejecución de un trigger

Definición de un trigger
CREATE TABLE item (
Partes de un trigger
item_id serial NOT NULL,
Definición formal del trigger nombre varchar(150) NOT NULL,
Nuestro primer trigger tipo varchar(100) NOT NULL,
Que es lo que queremos? cantidad int4 NOT NULL DEFAULT 0,
Variables del sistema precio_compra numeric(7,2) NOT NULL,
Variables del trigger precio_venta numeric(7,2) NOT NULL,
Función trigger CONSTRAINT item_id_pk PRIMARY KEY (item_id)
Otro trigger );

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 9
Que es lo que queremos?

Triggers
Nuestra tabla item tiene la capacidad de almacenar la información mas actual e
Triggers

Ejecución de un trigger
importante para la tienda de computadoras, pero hay otro tipo de información que no es
Definición de un trigger capaz de almacenar (por lo menos por ahora), la información del cambio de datos.
Partes de un trigger Nuestra tabla item no tiene memoria de los cambios que han sufrido sus tuplas, si alguien
Definición formal del trigger
viene y cambia el precio de venta de un artículo, no hay forma de obtener el precio
Nuestro primer trigger

Que es lo que queremos?
anterior.
Variables del sistema Si alguien borra un artículo, tampoco sabremos que artículo ha sido borrado ni por quien.
Variables del trigger Esto nos lleva a la primera gran área de utilización de los triggers, la auditoría de tablas.
Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 10
Que es lo que queremos?

Triggers
Entonces cuales son las acciones que debe realizar nuestro trigger?
Triggers

Ejecución de un trigger
 Necesitamos llevar un registro de todos los cambios relevantes en nuestra tabla
Definición de un trigger

Partes de un trigger
item, para empezar queremos tener un seguimiento de los cambios en los precios
Definición formal del trigger de los items.
Nuestro primer trigger

Que es lo que queremos?  También queremos almacenar en algún lugar todos aquellos items que hayan sido
Variables del sistema
eliminados, también queremos guardar sus respectivos historiales de cambios.
Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 11
Variables del sistema

Triggers
Antes de empezar a definir el trigger es necesario conocer una cuantas variables por
Triggers

Ejecución de un trigger
defecto que nos provee PostgreSQL:
Definición de un trigger

Partes de un trigger
current_user = el nombre del usuario que esta actualmente conectado a la base de
Definición formal del trigger datos y que ejecuta las sentencias.
Nuestro primer trigger

Que es lo que queremos? current_date = La fecha actual (del servidor, no del cliente)
Variables del sistema

Variables del trigger
current_time = La hora actual
Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 12
Variables del trigger

Triggers
PostgreSQL también maneja unas cuantas variables al momento de ejecutar un trigger,
Triggers

Ejecución de un trigger
estas son:
Definición de un trigger

Partes de un trigger
NEW = Variable compuesta que almacena los nuevos valores de la tupla que se esta
Definición formal del trigger modificando
Nuestro primer trigger

Que es lo que queremos? OLD = Variable compuesta que almacena los valores antiguos de la tupla que se esta
Variables del sistema
modificando
Variables del trigger

Función trigger

Otro trigger
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 función del trigger,
podemos accederlos de la forma TG_ARGV[0], TG_ARGV[1], etc.

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 13
Tabla adicional

Triggers
Como último paso antes de empezar a definir el trigger, debemos crear una tabla que vaya
Triggers

Ejecución de un trigger
a almacenar los cambios de precio en nuestra tabla item, la llamaremos
Definición de un trigger item_actualizado.
Partes de un trigger

Definición formal del trigger
CREATE TABLE item_actualizado (
Nuestro primer trigger
item_id int4 NOT NULL,
nombre varchar(150) NOT NULL,
precio_anterior numeric(7,2) NOT NULL,
Que es lo que queremos?

Variables del sistema
precio_actualizado numeric(7,2) NOT NULL,
Variables del trigger
autor varchar(100) NOT NULL,
Función trigger fecha_cambio date NOT NULL,
Otro trigger CONSTRAINT item_id_fk FOREIGN KEY (item_id) REFERENCES item(item_id)
);

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 14
Función trigger

Triggers

Triggers CREATE FUNCTION item_actualizado_tri()
Ejecución de un trigger RETURNS trigger
Definición de un trigger AS $$
Partes de un trigger
BEGIN
Definición formal del trigger
IF (TG_OP = 'UPDATE') THEN
Nuestro primer trigger
INSERT INTO item_actualizado VALUES (
OLD.item_id, OLD.nombre, OLD.precio_venta,
Que es lo que queremos?
NEW.precio_venta, current_user, current_date);
Variables del sistema
END IF;
Variables del trigger
RETURN NULL;
Función trigger END;
Otro trigger $$
Language 'plpgsql';

La nombramos con un sufijo tri para darnos cuenta que es una función perteneciente a un
trigger y no confundirla con otra que tengamos en nuestro servidor.

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 15
Definición formal del trigger

Triggers
Vamos a la definicion formal del trigger:
Triggers

Ejecución de un trigger CREATE TRIGGER actualizar_item
Definición de un trigger AFTER UPDATE ON item
Partes de un trigger FOR EACH ROW
Definición formal del trigger EXECUTE PROCEDURE item_actualizado_tri();
Nuestro primer trigger

Que es lo que queremos? Listo, cada vez que se actualice una tupla en la tabla item, se reflejará el cambio en la
Variables del sistema
tabla item_actualizado. Pero era eso lo que queriamos?, no totalmente, volvamos a la
Variables del trigger

Función trigger
función del trigger.
Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 16
Función trigger

Triggers

Triggers CREATE FUNCTION item_actualizado_tri()
Ejecución de un trigger RETURNS trigger
Definición de un trigger AS $$
Partes de un trigger
BEGIN
Definición formal del trigger
IF (TG_OP = 'UPDATE') THEN
Nuestro primer trigger
IF (OLD.precio_venta != NEW.precio_venta) THEN
INSERT INTO item_actualizado VALUES (
Que es lo que queremos?
OLD.item_id, OLD.nombre, OLD.precio_venta,
Variables del sistema
NEW.precio_venta, current_user, current_date);
Variables del trigger
END IF;
Función trigger END IF;
Otro trigger RETURN NULL;
END;
$$
Language 'plpgsql';

Ahora si, solo se insertarán tuplas en la tabla item_actualizado cuando se cambie el
valor de precio_venta .

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 17
Prueba

Triggers
Modifiquemos algún precio_venta de la tabla item y luego veamos la tabla
Triggers

Ejecución de un trigger
item_actualizado.
Definición de un trigger

Partes de un trigger

Definición formal del trigger

Nuestro primer trigger

Que es lo que queremos?

Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 18
Ejercicios

Triggers
Ejercicios:
Triggers

Ejecución de un trigger
 A la tabla item_actualizado añadir un atributo hora_cambio que almacene la
Definición de un trigger

Partes de un trigger
hora de la modificación.
Definición formal del trigger

Nuestro primer trigger  Hacer otro trigger que haga el mismo tratamiento pero con los items eliminados de
Que es lo que queremos? la tabla item.
Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 19
Añadiendo la hora

Triggers
Modificamos la tabla:
Triggers

Ejecución de un trigger CREATE TABLE item_actualizado (
Definición de un trigger item_id int4 NOT NULL,
Partes de un trigger nombre varchar(150) NOT NULL,
Definición formal del trigger precio_anterior numeric(7,2) NOT NULL,
Nuestro primer trigger precio_actualizado numeric(7,2) NOT NULL,
Que es lo que queremos? autor varchar(100) NOT NULL,
Variables del sistema
fecha_cambio date NOT NULL,
Variables del trigger
hora_cambio timetz NOT NULL,
CONSTRAINT item_id_fk FOREIGN KEY (item_id) REFERENCES item(item_id)
);
Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 20
Añadiendo la hora

Triggers
Modificamos la función:
Triggers

Ejecución de un trigger CREATE FUNCTION item_actualizado_tri()
Definición de un trigger RETURNS trigger
Partes de un trigger AS $$
Definición formal del trigger BEGIN
Nuestro primer trigger IF (TG_OP = 'UPDATE') THEN
Que es lo que queremos? IF (OLD.precio_venta != NEW.precio_venta) THEN
Variables del sistema
INSERT INTO item_actualizado VALUES (
Variables del trigger
OLD.item_id, OLD.nombre, OLD.precio_venta, NEW.precio_venta,
current_user, current_date, current_time);
END IF;
Función trigger

Otro trigger
END IF;
RETURN NULL;
END;
$$
Language 'plpgsql';

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 21
Información adicional

Triggers
Gracias a nuestra nueva tabla item_actualizado ahora podemos obtener mas información
Triggers

Ejecución de un trigger
acerca de nuestra tienda de computadoras.
Definición de un trigger Podemos saber:
Partes de un trigger

Definición formal del trigger  Que precio tenia cierto ítem en cierta temporada
Nuestro primer trigger

Que es lo que queremos?  Cuanto tiempo se ha mantenido el precio estable
Variables del sistema

Variables del trigger
 En que temporadas del año los precio caen o se disparan
Función trigger

Otro trigger
 Quienes han modificado los precios de los items

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 22
Otro trigger

Triggers
Ahora hagamos el trigger que haga el seguimiento de los items que han sido eliminados
Triggers
de nuestra tabla item:
Ejecución de un trigger

Definición de un trigger Primero creamos la tabla item_eliminado:
Partes de un trigger

Definición formal del trigger
CREATE TABLE item_eliminado (
Nuestro primer trigger
item_id int4 NOT NULL,
nombre varchar(150) NOT NULL,
Que es lo que queremos?
precio_compra numeric(7,2) NOT NULL,
Variables del sistema
precio_venta numeric(7,2) NOT NULL,
Variables del trigger
autor varchar(100) NOT NULL,
Función trigger fecha_eliminación date NOT NULL,
Otro trigger hora_eliminacion timetz NOT NULL
);

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 23
Función trigger

Triggers

Triggers CREATE FUNCTION item_eliminado_tri()
Ejecución de un trigger RETURNS trigger
Definición de un trigger AS $$
Partes de un trigger
BEGIN
Definición formal del trigger
IF (TG_OP = 'DELETE') THEN
Nuestro primer trigger
INSERT INTO item_eliminado VALUES (
OLD.item_id, OLD.nombre, OLD.precio_compra, OLD.precio_venta,
Que es lo que queremos?
current_user, current_date, current_time);
Variables del sistema
END IF;
Variables del trigger
RETURN NULL;
Función trigger END;
Otro trigger $$
Language 'plpgsql';

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 24
Definición formal del trigger

Triggers

Triggers CREATE TRIGGER eliminar_item
Ejecución de un trigger AFTER DELETE ON item
Definición de un trigger FOR EACH ROW
Partes de un trigger
EXECUTE PROCEDURE item_eliminado_tri();
Definición formal del trigger

Nuestro primer trigger

Que es lo que queremos?

Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 25
Problema

Triggers
Pero aquí nos surge un problema, solo podremos eliminar items que no tengan sus
Triggers

Ejecución de un trigger
correspondientes cambios en la tabla item_actualizado, una solución seria eliminar todo
Definición de un trigger su registro de cambios antes de hacer la eliminación.
Partes de un trigger

Definición formal del trigger

Nuestro primer trigger

Que es lo que queremos?

Variables del sistema

Variables del trigger

Función trigger

Otro trigger

http://www.postgresql.org PostgreSQL Módulo 1 – Slide 26