Ir al contenido principal
Documentos
Funciones de cadenaDesencadenaBases de datosFunciones JSONFunciones matemáticasFunciones de fechaÍndicesSintaxis básicaGestión de Tablas y Esquemas

Disparadores PostgreSQL ANTES

Los desencadenantes en PostgreSQL son funciones que se ejecutan automáticamente en respuesta a eventos específicos en una tabla, como INSERTAR, ACTUALIZAR o ELIMINAR. Un activador "ANTES" se dispara antes de que se produzca el evento, lo que te permite modificar los datos o aplicar restricciones antes de que se consignen los cambios en los datos.

Utilización
Los activadores `BEFORE` se utilizan para validar o modificar datos antes de que se inserten, actualicen o eliminen en una tabla. Suelen emplearse para aplicar reglas de negocio, validar la integridad de los datos o actualizar campos automáticamente.

sql
CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE OR DELETE
ON table_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

En esta sintaxis, la palabra clave "ANTES" especifica que el activador debe activarse antes de que se produzca el evento o eventos especificados. Los activadores "ANTES" difieren de los activadores "DESPUÉS", ya que los activadores "ANTES" se ejecutan antes del evento, lo que permite manipular los datos antes de que finalice la transacción.

Ejemplos

1. Activador básico ANTES DE INSERTAR

sql
CREATE OR REPLACE FUNCTION check_positive_salary()
RETURNS TRIGGER AS $$
BEGIN
  IF NEW.salary < 0 THEN
    RAISE EXCEPTION 'Salary cannot be negative';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER check_salary_trigger
BEFORE INSERT
ON employees
FOR EACH ROW
EXECUTE FUNCTION check_positive_salary();

Este ejemplo crea un disparador que comprueba si el `salario` es positivo antes de insertar una nueva fila en la tabla `empleados`.

2. Disparador ANTES DE ACTUALIZAR para registrar cambios

sql
CREATE OR REPLACE FUNCTION log_update()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO employees_audit(employee_id, old_salary, new_salary, changed_on)
  VALUES(OLD.id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER log_update_trigger
BEFORE UPDATE
ON employees
FOR EACH ROW
EXECUTE FUNCTION log_update();

Aquí, un activador registra los cambios en el campo "salario" de una tabla "auditoría_empleados" antes de que se produzca una actualización.

3. Activador ANTES DE ELIMINAR para acciones en cascada

sql
CREATE OR REPLACE FUNCTION prevent_deletion()
RETURNS TRIGGER AS $$
BEGIN
  IF EXISTS (SELECT 1 FROM orders WHERE orders.employee_id = OLD.id) THEN
    RAISE EXCEPTION 'Employee cannot be deleted, related orders exist';
  END IF;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER prevent_deletion_trigger
BEFORE DELETE
ON employees
FOR EACH ROW
EXECUTE FUNCTION prevent_deletion();

Este activador impide eliminar a un empleado si existen pedidos relacionados en la tabla "Pedidos".

Consejos y buenas prácticas

  • Utiliza nombres de activadores descriptivos. Esto mejora la legibilidad y el mantenimiento, dejando claro para qué sirve cada activador.
  • Simplifica las funciones de activación. Una lógica compleja puede provocar problemas de rendimiento y es más difícil de depurar.
  • Prueba a fondo. Asegúrate de que los activadores se comportan como se espera en todos los escenarios para evitar problemas de integridad de los datos.
  • Activadores de documentos. Documenta claramente el propósito y la lógica de cada activación para futuras referencias y colaboración en equipo.
  • Considera el impacto en el rendimiento. Los desencadenantes pueden afectar al rendimiento; utilízalos con criterio, especialmente en tablas grandes o en operaciones frecuentes.
  • Comprende el comportamiento de las transacciones. Los activadores "ANTES" se ejecutan dentro de la transacción que los disparó, y los cambios pueden revertirse si la transacción falla.
  • Devuelve la fila correcta. Devuelve siempre `NEW` u `OLD` apropiadamente para asegurar que el activador funciona correctamente.
  • Desactivar temporalmente los activadores. Puedes desactivar los activadores durante operaciones masivas o tareas de mantenimiento utilizando `ALTER TABLE nombre_tabla DISABLE TRIGGER nombre_activador;` y volver a activarlos con `ALTER TABLE nombre_tabla ENABLE TRIGGER nombre_activador;`.