Saltar al contenido principal
eLearner.app
Módulo 12 · Lección 3 de 447/57 en el curso~15 min
Lecciones del módulo (3/4)

Introducción a los disparadores (triggers)

Un disparador es una caja mágica (un sensor) que ejecuta automáticamente una pieza de lógica ANTES o DESPUÉS de un evento de inserción, actualización o eliminación en los datos.\nAntes de enseñarle a una tabla a reaccionar, debemos darle una "Función de disparador" especial escrita en PL/pgSQL que debe finalizar devolviendo un formato sintético llamado "TRIGGER".

Estas funciones no aceptan argumentos normales entre paréntesis; en su lugar, ofrecen los objetos mágicos integrados NEW y OLD de forma gratuita, que contienen los datos de fila originales o entrantes de la tabla que el sensor está observando.

SQL
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
  -- OLD.id is magically the id value of the poor record being deleted
  INSERT INTO audit_log (table_name, record_id, action)
  VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');

  RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;

Este procedimiento realiza el arduo trabajo de escribir en el registro. Posteriormente, en un segundo paso, quedará conectado permanentemente a los eventos de la mesa que queremos proteger.

Pruébalo tú mismo

Ejercicio#sql.m12.l3.e1
Intentos: 0Cargando...

Necesitamos proteger a los clientes: nadie menor de 18 años (nuestro control virtual) o, más allá de la lógica ficticia, queremos forzar que la cadena 'first_name' pasada en el momento INSERT se almacene siempre en mayúsculas en la base de datos, ignorando cualquier formato del cliente JS. Escriba una función de activación llamada 'force_uppercase_name()'. No acepta argumentos (). Devuelve TRIGGER. Cree la plantilla del cuerpo. Force la asignación de todo el objeto entrante mediante la asignación mágica 'NEW.first_name = UPPER(NEW.first_name);'. Luego DEVUELVA la NUEVA variable reformada.

Cargando editor...
Mostrar pista

CREAR O REEMPLAZAR FUNCIÓN force_uppercase_name() DEVUELVE EL DISPARADOR COMO $$ COMIENZA NEW.first_name = UPPER(NEW.first_name); REGRESAR NUEVO; FIN; $$ IDIOMA plpgsql;

Solución disponible después de 3 intentos

Ejercicio#sql.m12.l3.e2
Intentos: 0Cargando...

Cree una función de activación 'protect_price_drops()' que bloquee las actualizaciones maliciosas en las que un atacante está a punto de ahorrar un precio ridículamente bajo en un producto. Utilice lógica como 'IF NEW.unit_price < OLD.unit_price THEN', generando una excepción nativa que hace que todo colapse. Una excepción fatal de PL/pgSQL utiliza la forma 'RAISE EXCEPTION ''Prezzo non abbassabile!';'.

Cargando editor...
Mostrar pista

COMIENZAR SI NEW.unit_price < ANTIGUO.unit_price ENTONCES AUMENTAR LA EXCEPCIÓN 'Prezzo non abbassabile!'; FINALIZAR SI; REGRESAR NUEVO; FIN;

Solución disponible después de 3 intentos