Qué es un trigger
Un trigger (disparador) es un bloque de SQL que la base de datos ejecuta
sola, de forma automática, cuando ocurre un evento sobre una tabla: un
INSERT, un UPDATE o un DELETE. Sirve para mantener datos derivados,
registrar auditorías o aplicar reglas sin depender de que la aplicación se
acuerde de hacerlo.
CREATE TRIGGER nombre_trigger
AFTER INSERT ON ventas
BEGIN
-- SQL a ejecutar cuando se inserta una fila en ventas
END;
AFTER / BEFORE y el evento
AFTERse ejecuta después de que el cambio ya está hecho;BEFORE, justo antes. Para auditar lo ocurrido, lo normal esAFTER.- El evento puede ser
INSERT,UPDATEoDELETEONuna tabla. - En SQLite el trigger se dispara una vez por cada fila afectada (es
FOR EACH ROWde forma implícita).
Las filas NEW y OLD
Dentro del cuerpo tienes dos "filas virtuales" para leer los valores en juego:
| Pseudotabla | Disponible en | Qué contiene |
|---|---|---|
NEW |
INSERT, UPDATE |
los valores nuevos de la fila. |
OLD |
UPDATE, DELETE |
los valores previos de la fila. |
CREATE TRIGGER log_ventas
AFTER INSERT ON ventas
BEGIN
INSERT INTO auditoria (accion, venta_id, importe)
VALUES ('alta', NEW.id, NEW.importe);
END;
Así, cada vez que entre una venta, el trigger escribe automáticamente una línea
en auditoria con los datos de NEW. Para comprobar su efecto, la última
sentencia consulta la tabla que el trigger ha rellenado:
INSERT INTO ventas (id, producto_id, dia, importe) VALUES (7, 2, 4, 99);
SELECT accion, venta_id, importe FROM auditoria ORDER BY venta_id;
Los triggers son potentes pero invisibles: como actúan por su cuenta, conviene nombrarlos con claridad y documentarlos para que el equipo sepa que existen.
Ejemplos
Auditar cada alta en ventas con un trigger AFTER INSERT
CREATE TABLE auditoria (
id INTEGER PRIMARY KEY AUTOINCREMENT,
accion TEXT,
venta_id INTEGER,
importe REAL
);
CREATE TRIGGER log_ventas
AFTER INSERT ON ventas
BEGIN
INSERT INTO auditoria (accion, venta_id, importe)
VALUES ('alta', NEW.id, NEW.importe);
END;
INSERT INTO ventas (id, producto_id, dia, importe) VALUES (7, 2, 4, 99);
SELECT accion, venta_id, importe FROM auditoria ORDER BY venta_id;