Consideraciones sobre el rendimiento de PostgreSQL
Los desencadenantes en PostgreSQL son funciones de devolución de llamada de la base de datos que se invocan o ejecutan automáticamente en respuesta a determinados eventos en una tabla o vista concreta. Se utilizan para hacer cumplir las normas empresariales, validar los datos de entrada y mantener la integridad de los datos.
Utilización
Los desencadenantes se emplean cuando necesitas ejecutar automáticamente una función en respuesta a eventos como las operaciones `INSERT`, `UPDATE` o `DELETE` en una tabla. Se definen para actuar antes o después de estos acontecimientos.
sql
CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE function_name(arguments);
En esta sintaxis, `CREATE TRIGGER` configura un activador llamado `trigger_name` que ejecuta `function_name` cuando se producen los eventos especificados en `table_name`.
Ejemplos
1. Activador básico de inserción
sql
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_table(action, time) VALUES ('INSERT', NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER insert_audit
AFTER INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE log_insert();
Este activador registra cada operación de inserción en "mi_tabla" añadiendo un registro a "tabla_de_auditoría".
2. Activador de actualización con lógica condicional
sql
CREATE OR REPLACE FUNCTION check_update()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.amount < 0 THEN
RAISE EXCEPTION 'Amount cannot be negative';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER check_update_trigger
BEFORE UPDATE ON transactions
FOR EACH ROW EXECUTE PROCEDURE check_update();
Este activador verifica que la columna "importe" de la tabla "transacciones" no sea negativa antes de las operaciones de actualización.
3. Activador de borrados en cascada
sql
CREATE OR REPLACE FUNCTION cascade_delete()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM child_table WHERE parent_id = OLD.id;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER cascading_delete_trigger
AFTER DELETE ON parent_table
FOR EACH ROW EXECUTE PROCEDURE cascade_delete();
Este activador garantiza que cuando se elimine una fila de `tabla_padre`, también se eliminen las filas relacionadas en `tabla_hija`.
Consejos y buenas prácticas
- Lógica de activación de límites. Mantén las funciones de activación sencillas para minimizar la sobrecarga de rendimiento y evitar la lógica empresarial compleja.
- Utiliza activadores a nivel de fila de forma selectiva. Opta por disparadores a nivel de sentencia siempre que sea posible, para reducir el número de ejecuciones. Los desencadenantes a nivel de fila son útiles cuando hay que realizar operaciones en cada fila afectada, mientras que los desencadenantes a nivel de sentencia pueden reducir la sobrecarga al ejecutarse una vez por operación.
- Ten cuidado con los activadores recursivos. Asegúrate de que los activadores no se llamen a sí mismos involuntariamente, provocando bucles infinitos.
- Prueba a fondo. Prueba exhaustivamente los activadores en un entorno de desarrollo para evaluar su impacto en el rendimiento.
- Activadores de documentos. Documenta claramente la finalidad y la lógica de cada activador para futuras referencias y mantenimiento.
- Considera los límites de la transacción. Ten en cuenta los límites de las transacciones para asegurarte de que los activadores se comportan como es debido en las transacciones con varios estados.
- Controla el rendimiento. Vigila el impacto en el rendimiento de los activadores en un sistema activo y diagnostica cualquier problema utilizando las herramientas de registro y supervisión de PostgreSQL.
Gestionar desencadenantes
- Para desactivar temporalmente un activador, utiliza el comando `ALTER TABLE ... comando "DESACTIVAR DISPARO".
- Para eliminar permanentemente un disparador, utiliza el comando `DROP TRIGGER`.