Els triggers (triggers en anglès) són una funcionalitat avançada de PostgreSQL que permet executar automàticament una funció o procediment en resposta a certs esdeveniments en una taula. Els triggers són útils per a mantenir la integritat de les dades, auditar canvis, i implementar lògica de negoci complexa.
Conceptes Clau
- Esdeveniments de Trigger: Els esdeveniments que poden activar un trigger inclouen
INSERT
,UPDATE
,DELETE
, iTRUNCATE
. - Moment del Trigger: Els triggers poden ser executats
BEFORE
(abans) oAFTER
(després) de l'esdeveniment. - Nivell del Trigger: Els triggers poden ser definits a nivell de fila (
FOR EACH ROW
) o a nivell de declaració (FOR EACH STATEMENT
).
Creació d'un Trigger
Pas 1: Crear una Funció de Trigger
Abans de crear un trigger, necessitem definir una funció que serà executada pel trigger. Aquesta funció ha de retornar el tipus TRIGGER
.
CREATE OR REPLACE FUNCTION exemple_trigger_func() RETURNS TRIGGER AS $$ BEGIN -- Aquí va la lògica del trigger RAISE NOTICE 'Trigger activat per %', TG_OP; RETURN NEW; END; $$ LANGUAGE plpgsql;
Pas 2: Crear el Trigger
Un cop tenim la funció de trigger, podem crear el trigger associat a una taula específica.
CREATE TRIGGER exemple_trigger AFTER INSERT OR UPDATE ON exemple_taula FOR EACH ROW EXECUTE FUNCTION exemple_trigger_func();
Exemple Pràctic
Escenari
Suposem que tenim una taula empleats
i volem mantenir un registre de tots els canvis en una taula d'auditoria empleats_auditoria
.
Crear les Taules
CREATE TABLE empleats ( id SERIAL PRIMARY KEY, nom VARCHAR(100), salari NUMERIC ); CREATE TABLE empleats_auditoria ( id SERIAL PRIMARY KEY, empleat_id INT, operacio VARCHAR(10), data_operacio TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Crear la Funció de Trigger
CREATE OR REPLACE FUNCTION auditar_empleats() RETURNS TRIGGER AS $$ BEGIN IF TG_OP = 'INSERT' THEN INSERT INTO empleats_auditoria (empleat_id, operacio) VALUES (NEW.id, 'INSERT'); ELSIF TG_OP = 'UPDATE' THEN INSERT INTO empleats_auditoria (empleat_id, operacio) VALUES (NEW.id, 'UPDATE'); ELSIF TG_OP = 'DELETE' THEN INSERT INTO empleats_auditoria (empleat_id, operacio) VALUES (OLD.id, 'DELETE'); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
Crear el Trigger
CREATE TRIGGER auditar_trigger AFTER INSERT OR UPDATE OR DELETE ON empleats FOR EACH ROW EXECUTE FUNCTION auditar_empleats();
Exercicis Pràctics
Exercici 1: Crear un Trigger per a Validar Dades
- Objectiu: Crear un trigger que impedeixi la inserció de registres en una taula
productes
si el preu és negatiu. - Passos:
- Crear la taula
productes
. - Crear la funció de trigger per validar el preu.
- Crear el trigger associat.
- Crear la taula
Solució
-- Crear la taula productes CREATE TABLE productes ( id SERIAL PRIMARY KEY, nom VARCHAR(100), preu NUMERIC ); -- Crear la funció de trigger CREATE OR REPLACE FUNCTION validar_preu() RETURNS TRIGGER AS $$ BEGIN IF NEW.preu < 0 THEN RAISE EXCEPTION 'El preu no pot ser negatiu'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- Crear el trigger CREATE TRIGGER validar_preu_trigger BEFORE INSERT OR UPDATE ON productes FOR EACH ROW EXECUTE FUNCTION validar_preu();
Exercici 2: Crear un Trigger per a Actualitzar una Data de Modificació
- Objectiu: Crear un trigger que actualitzi automàticament una columna
data_modificacio
en una taulaclients
cada vegada que es faci unUPDATE
. - Passos:
- Crear la taula
clients
amb una columnadata_modificacio
. - Crear la funció de trigger per actualitzar la data.
- Crear el trigger associat.
- Crear la taula
Solució
-- Crear la taula clients CREATE TABLE clients ( id SERIAL PRIMARY KEY, nom VARCHAR(100), data_modificacio TIMESTAMP ); -- Crear la funció de trigger CREATE OR REPLACE FUNCTION actualitzar_data_modificacio() RETURNS TRIGGER AS $$ BEGIN NEW.data_modificacio = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; -- Crear el trigger CREATE TRIGGER actualitzar_data_modificacio_trigger BEFORE UPDATE ON clients FOR EACH ROW EXECUTE FUNCTION actualitzar_data_modificacio();
Errors Comuns i Consells
- Oblidar el
RETURN NEW
oRETURN OLD
: En funcions de trigger, és crucial retornar el registre nou (NEW
) o vell (OLD
) segons correspongui. - No especificar correctament el moment del trigger: Assegura't de definir si el trigger ha de ser executat
BEFORE
oAFTER
l'esdeveniment. - Confondre el nivell del trigger: Recorda que
FOR EACH ROW
s'executa per cada fila afectada, mentre queFOR EACH STATEMENT
s'executa una vegada per l'operació completa.
Conclusió
Els triggers són una eina poderosa en PostgreSQL per automatitzar tasques i assegurar la integritat de les dades. Amb una comprensió clara dels conceptes bàsics i la pràctica amb exemples reals, pots utilitzar triggers per millorar significativament la funcionalitat de les teves bases de dades.
Curs de PostgreSQL
Mòdul 1: Introducció a PostgreSQL
Mòdul 2: Operacions bàsiques de SQL
Mòdul 3: Consultes SQL avançades
Mòdul 4: Disseny de bases de dades i normalització
Mòdul 5: Funcionalitats avançades de PostgreSQL
Mòdul 6: Optimització i millora del rendiment
- Optimització de consultes
- Estratègies d'indexació
- Analitzant el rendiment de les consultes
- Vacuuming i manteniment
Mòdul 7: Seguretat i gestió d'usuaris
- Rols d'usuari i permisos
- Mètodes d'autenticació
- Encriptació de dades
- Còpia de seguretat i restauració
Mòdul 8: Treballant amb JSON i funcionalitats NoSQL
Mòdul 9: Extensions i eines avançades
- PostGIS per a dades geoespacials
- Cerca de text complet
- Wrappers de dades externes
- PL/pgSQL i altres llenguatges procedimentals