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

PostgreSQL EN LUGAR DE triggers

Los desencadenantes en PostgreSQL son procedimientos especiales que se ejecutan automáticamente en respuesta a determinados eventos en una tabla o vista. El activador `INSTEAD OF` te permite definir un comportamiento personalizado para acciones como `INSERTAR`, `ACTUALIZAR` o `ELIMINAR` en las vistas.

Utilización

Los activadores `INSTEAD OF` se utilizan cuando necesitas anular la acción predeterminada de una vista, lo que permite una lógica compleja o una manipulación de datos que no es directamente compatible con las operaciones SQL estándar. Estos desencadenantes se definen para que se produzcan "ANTES" del evento desencadenante. Ten en cuenta que los activadores `INSTEAD OF` sólo son aplicables a las vistas y no a las tablas.


CREATE TRIGGER trigger_name
INSTEAD OF {INSERT | UPDATE | DELETE}
ON view_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

En esta sintaxis, `INSTEAD OF` especifica que el activador sustituirá la operación por defecto en la vista especificada por la lógica definida en `function_name`. Los registros `NEW` y `OLD` dentro de las funciones desencadenantes representan los datos nuevos para un `INSERT` o `UPDATE`, y los datos existentes para `UPDATE` o `DELETE`, respectivamente.

Ejemplos

1. Activador básico INSERTAR EN VEZ DE INSERTAR


CREATE FUNCTION insert_employee()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO employees (id, name)
    VALUES (NEW.id, NEW.name);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_employee_trigger
INSTEAD OF INSERT ON employees_view
FOR EACH ROW
EXECUTE FUNCTION insert_employee();

Este ejemplo define un activador `INSTEAD OF INSERT` que inserta datos en la tabla `employees` cuando se intenta realizar una inserción en `employees_view`.

2. desencadenante en lugar de actualizar


CREATE FUNCTION update_employee_name()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE employees
    SET name = NEW.name
    WHERE id = OLD.id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_employee_trigger
INSTEAD OF UPDATE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION update_employee_name();

Este activador sustituye una actualización de `vista_empleados` por una actualización de `empleados`, cambiando el campo `nombre` en función de los cambios de la vista.

3. DISPARO DE SUPR


CREATE FUNCTION delete_employee()
RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM employees
    WHERE id = OLD.id;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER delete_employee_trigger
INSTEAD OF DELETE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION delete_employee();

El activador gestiona las eliminaciones en `vista_empleados` eliminando la entrada correspondiente en la tabla `empleados`.

Consejos y buenas prácticas

  • Uso con vistas. Los activadores `INSTEAD OF` son más útiles con las vistas, ya que te permiten definir cómo se traducen las operaciones de una vista a las tablas base.
  • Garantizar la corrección de la función. La función utilizada en el activador debe manejar todos los casos posibles de la operación para evitar comportamientos inesperados.
  • Prueba a fondo los activadores. Dado que los activadores pueden alterar el comportamiento por defecto, es crucial realizar pruebas exhaustivas para garantizar que funcionan como se espera de ellos.
  • Utiliza las transacciones. Considera la posibilidad de utilizar transacciones dentro de las funciones desencadenantes para mantener la integridad de los datos, especialmente cuando la operación implique varios pasos.
  • Documenta tus desencadenantes. Una documentación clara ayuda a mantener la legibilidad del código y ayuda a otros programadores a comprender la lógica personalizada.
  • Considera las implicaciones para el rendimiento. Ten en cuenta que la lógica compleja de los activadores `INSTEAD OF` puede sobrecargar el rendimiento, así que optimiza las funciones de activación para que sean eficientes.

Consideraciones adicionales

  • Casos prácticos. Los activadores `INSTEAD OF` son especialmente útiles para manejar la lógica de vistas complejas que no puede expresarse directamente en SQL.
  • Información sobre la versión. Los activadores `INSTEAD OF` se introdujeron en la versión 9.1 de PostgreSQL, lo que es importante para la compatibilidad con sistemas antiguos.