Ir al contenido
wannacode

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.

SQLbase de datos: tienda
  • 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.
  • OLD es la fila antes del cambio, NEW después.
  • Entre BEGIN y END está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.

SQLbase de datos: tienda

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.

SQLbase de datos: tienda

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

Ponte a prueba

1. ¿Qué son OLD y NEW en un trigger después de UPDATE?
2. Un trigger se ejecuta…
3. ¿Cuál es una desventaja de los triggers?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·