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
productessi 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_modificacioen una taulaclientscada vegada que es faci unUPDATE. - Passos:
- Crear la taula
clientsamb 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 NEWoRETURN 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
BEFOREoAFTERl'esdeveniment. - Confondre el nivell del trigger: Recorda que
FOR EACH ROWs'executa per cada fila afectada, mentre queFOR EACH STATEMENTs'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
