Triggers
En resumen: Un trigger es un conjunto de sentencias que la base de datos ejecuta por su cuenta en un INSERT, UPDATE o DELETE de una tabla, por ejemplo para registrar cambios de precio o actualizar las existencias.
Problema
¿Quién cambió el precio?
Un cliente se queja de que ayer el café costaba menos. La base de datos solo tiene el precio de hoy. ¿Cuándo se cambió, y desde cuál? No hay forma de saberlo.
Podrías hacer que cada programa que toca precios escriba también en un registro. Pero alguien se olvidará: un script para una subida de precios, una corrección manual, un programa nuevo dentro de un año.
La idea
Un trigger
Un trigger es una consulta que la base de datos ejecuta por sí sola cuando algo cambia en una tabla. Se escribe una vez y vale para todos los que escriben en la base de datos.
AFTER UPDATE OF price ON products: después de cada cambio del precio.WHEN OLD.price <> NEW.price: solo si el precio de verdad es distinto.OLDes la fila antes del cambio,NEWdespués.- Entre
BEGINyENDestán las consultas del trigger. Aquí no significan una transacción, sino su cuerpo.
Los dos cambios de precio están en el registro, sin que el programa lo sepa.
Míralo
Las existencias solas
Un trigger también puede mantener datos: cada línea nueva de un pedido reduce las existencias del producto.
Las manzanas eran 80, ahora son 77. El trigger se ejecuta en la misma transacción que el INSERT. Si el pedido se deshace, también se deshacen las existencias.
Pruébalo
Una alerta por una reseña mala
La tabla alerts (review_id, product_id) ya existe. Escribe un trigger que, ante una reseña nueva con rating 1, escriba en alerts el número de la reseña y el producto. La comprobación añade dos reseñas, con 1 y con 5, y mira alerts.
Solución
CREATE TRIGGER bad_review
AFTER INSERT ON reviews
WHEN NEW.rating = 1
BEGIN
INSERT INTO alerts VALUES (NEW.id, NEW.product_id);
END;CREATE TRIGGER bad_reviewAFTER INSERT ON reviewsWHEN NEW.rating = 1BEGIN INSERT INTO alerts VALUES (NEW.id, NEW.product_id);END;Solo la reseña con 1 entra en alerts.
La idea
Cuándo sí, cuándo no
Los triggers sirven para lo que debe pasar siempre, escriba el programa que escriba: un registro de cambios, mantener al día una columna calculada, una comprobación que CHECK no puede hacer.
Su precio: la lógica está escondida. Quien lee el código del programa ve un INSERT, y la base de datos hace tres cosas más. Un trigger que dispara un trigger que dispara un trigger es difícil de depurar. Las reglas de negocio, como los descuentos y las ofertas, suelen ser más claras en el código del programa.
Más precisamente, para curiosos
En PostgreSQL el cuerpo de un trigger es una función aparte (CREATE FUNCTION … RETURNS trigger, y luego CREATE TRIGGER … EXECUTE FUNCTION). También hay triggers BEFORE, que pueden cambiar NEW antes de que la fila entre. SQLite tiene tanto BEFORE como INSTEAD OF para las vistas.
Test