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

  1. Esdeveniments de Trigger: Els esdeveniments que poden activar un trigger inclouen INSERT, UPDATE, DELETE, i TRUNCATE.
  2. Moment del Trigger: Els triggers poden ser executats BEFORE (abans) o AFTER (després) de l'esdeveniment.
  3. 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

  1. Objectiu: Crear un trigger que impedeixi la inserció de registres en una taula productes si el preu és negatiu.
  2. Passos:
    • Crear la taula productes.
    • Crear la funció de trigger per validar el preu.
    • Crear el trigger associat.

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ó

  1. Objectiu: Crear un trigger que actualitzi automàticament una columna data_modificacio en una taula clients cada vegada que es faci un UPDATE.
  2. Passos:
    • Crear la taula clients amb una columna data_modificacio.
    • Crear la funció de trigger per actualitzar la data.
    • Crear el trigger associat.

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

  1. Oblidar el RETURN NEW o RETURN OLD: En funcions de trigger, és crucial retornar el registre nou (NEW) o vell (OLD) segons correspongui.
  2. No especificar correctament el moment del trigger: Assegura't de definir si el trigger ha de ser executat BEFORE o AFTER l'esdeveniment.
  3. Confondre el nivell del trigger: Recorda que FOR EACH ROW s'executa per cada fila afectada, mentre que FOR 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

Mòdul 7: Seguretat i gestió d'usuaris

Mòdul 8: Treballant amb JSON i funcionalitats NoSQL

Mòdul 9: Extensions i eines avançades

Mòdul 10: Estudis de cas i aplicacions del món real

© Copyright 2024. Tots els drets reservats