Café y Código

4. Disparadores Automáticos (Triggers) 🔫

Eventos Fantasma

Muchas veces quieres que algo pase automáticamente en la base de datos sin que la aplicación (Node, Python) tenga que dar la orden.

Un Trigger es un bloque de código PL/SQL que "escucha" y se dispara solo cuando alguien intenta hacer un INSERT, un UPDATE o un DELETE en una tabla específica.

¿Para qué sirven? Casos de uso

  • Auditoría: (El uso más común) Guardar un historial de todos los salarios modificados y quién los modificó.
  • Reglas de negocio estrictas: Impedir que alguien actualice un pedido a "Cancelado" si ya está "Enviado".
  • Campos calculados automáticos: Cada vez que se añade un producto (insert), restar 1 del stock.

Sintaxis y Magia: OLD y NEW

La gran magia de los triggers es que tienen acceso a dos registros fantasma: :NEW (cómo quedará el dato después del cambio) y :OLD (cómo estaba el dato antes del cambio).

SQL
1 -- Trigger para auditar los aumentos de salario
2 CREATE OR REPLACE TRIGGER trg_AuditarSalario
3 AFTER UPDATE OF salario ON empleados
4 FOR EACH ROW -- Ejecutar esto por CADA FILA que haya sido modificada
5 BEGIN
6 -- Comparamos lo viejo con lo nuevo
7 IF :NEW.salario > :OLD.salario THEN
8 -- Insertar en una tabla de bitácora
9 INSERT INTO historial_salarios (empleado_id, viejo_salario, nuevo_salario, fecha)
10 VALUES (:OLD.id, :OLD.salario, :NEW.salario, SYSDATE);
11 END IF;
12 END;
Con un Gran Poder... Los Triggers son peligrosos porque suceden "en la sombra". Si una consulta de tu backend repentinamente falla o se vuelve muy lenta, muchas veces la culpa la tiene un Trigger escondido haciendo trabajo pesado silenciosamente.

🎮 Previniendo Horrores

Si quisieras usar un Trigger para impedir (abortar) que alguien borre a un "Gerente", ¿deberías usar un trigger tipo BEFORE DELETE o AFTER DELETE?

👁️ Ver respuesta sugerida

Debería ser BEFORE DELETE. De esa forma, evaluamos el cargo del empleado antes de que el motor lo borre, y si es 'Gerente', lanzamos un error y frenamos la operación.

Ponte a prueba

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.