Los desencadenantes en PostgreSQL son funciones de retrollamada de la base de datos que se ejecutan automáticamente cuando se produce un evento especificado en la base de datos, como una operación `INSERT`, `UPDATE` o `DELETE`. Se utilizan para hacer cumplir las normas empresariales, validar los datos de entrada y mantener la integridad de los datos.
Utilización
Los desencadenantes automatizan tareas y aplican reglas a nivel de base de datos, garantizando que se produzcan operaciones específicas en respuesta a cambios en los datos. Constan de un evento desencadenante, una temporización y la función asociada que debe ejecutarse.
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE}ON table_name
FOREACHROWEXECUTEFUNCTIONfunction_name();Con la tecnología de
En esta sintaxis, "CREAR DISPARADOR" define un nuevo disparador, especificando cuándo debe dispararse ("ANTES", "DESPUÉS" o "ANTES DE" un evento) y la función que debe ejecutar. Los activadores "ANTES" se suelen utilizar para modificar datos antes de que se escriban en la base de datos, los activadores "DESPUÉS" se utilizan para acciones que deben producirse una vez que los datos se han consignado, y los activadores "ANTES DE" se suelen utilizar en las vistas para realizar las modificaciones necesarias en las tablas subyacentes.
FOR EACH ROW indica que la función desencadenante se ejecutará una vez por cada fila afectada por el evento desencadenante. En cambio, FOR EACH STATEMENT podría utilizarse para ejecutar la función desencadenante una vez por sentencia SQL, independientemente del número de filas afectadas.
NEW y OLD son variables de registro especiales dentro de los activadores: NEW contiene los datos de la nueva fila para las operaciones INSERT o UPDATE, y OLD contiene los datos de la fila existente para las operaciones UPDATE o DELETE.
Ejemplos
1. Activador básico de inserción
CREATEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGIN-- Log every insert operation into log_table
INSERTINTOlog_table(action, timestamp)VALUES('Insert',now());RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER before_insert
BEFOREINSERTON main_table
FOREACHROWEXECUTEFUNCTIONlog_insert();Con la tecnología de
Este ejemplo crea un activador que registra cada operación de inserción en la `tabla_principal` en una `tabla_de_registro`.
2. Actualizar activador con condición
CREATEFUNCTIONupdate_timestamp()RETURNSTRIGGERAS $$
BEGIN-- Update the updated_at timestamp field when a row is modified
NEW.updated_at :=now();RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER update_time
BEFOREUPDATEON main_table
FOREACHROWWHEN(OLD.*ISDISTINCTFROMNEW.*)EXECUTEFUNCTIONupdate_timestamp();Con la tecnología de
Este activador actualiza el campo de fecha y hora `updated_at` de `main_table` cada vez que se modifica una fila.
3. Desencadenante complejo de auditoría
CREATEFUNCTIONaudit_changes()RETURNSTRIGGERAS $$
BEGINIF(TG_OP='DELETE')THEN-- Log DELETE operations into audit_log
INSERTINTOaudit_log(action, old_data, timestamp)VALUES('DELETE',OLD,now());ELSIF(TG_OP='UPDATE')THEN-- Log UPDATE operations with both old and newdataINSERTINTOaudit_log(action, old_data, new_data, timestamp)VALUES('UPDATE',OLD,NEW,now());ENDIF;RETURNNULL;END;
$$ LANGUAGE plpgsql;CREATETRIGGER audit_trigger
AFTERINSERTORUPDATEORDELETEON main_table
FOREACHROWEXECUTEFUNCTIONaudit_changes();Con la tecnología de
Este activador registra los cambios realizados en `main_table` en un `audit_log`, capturando tanto los datos antiguos como los nuevos para las operaciones `UPDATE`.
Consejos y buenas prácticas
Optimiza el rendimiento. Los desencadenantes pueden añadir sobrecarga a las operaciones de la base de datos, así que asegúrate de que sean eficientes.
Utiliza los desencadenantes con moderación. Evita el uso excesivo de activadores para evitar la complejidad y los posibles problemas de rendimiento.
Garantiza la atomicidad. Asegúrate de que las funciones desencadenantes son atómicas y gestionan las excepciones para mantener la integridad de los datos.
Prueba a fondo. Prueba rigurosamente los activadores en un entorno de desarrollo antes de desplegarlos en producción para evitar efectos secundarios no deseados.
Considera alternativas. Evalúa si los procedimientos almacenados o la lógica de la aplicación podrían ser más adecuados para determinadas operaciones, a fin de garantizar la claridad y la mantenibilidad.
Los desencadenantes en PostgreSQL son funciones de retrollamada de la base de datos que se ejecutan automáticamente cuando se produce un evento especificado en la base de datos, como una operación `INSERT`, `UPDATE` o `DELETE`. Se utilizan para hacer cumplir las normas empresariales, validar los datos de entrada y mantener la integridad de los datos.
Utilización
Los desencadenantes automatizan tareas y aplican reglas a nivel de base de datos, garantizando que se produzcan operaciones específicas en respuesta a cambios en los datos. Constan de un evento desencadenante, una temporización y la función asociada que debe ejecutarse.
En esta sintaxis, "CREAR DISPARADOR" define un nuevo disparador, especificando cuándo debe dispararse ("ANTES", "DESPUÉS" o "ANTES DE" un evento) y la función que debe ejecutar. Los activadores "ANTES" se suelen utilizar para modificar datos antes de que se escriban en la base de datos, los activadores "DESPUÉS" se utilizan para acciones que deben producirse una vez que los datos se han consignado, y los activadores "ANTES DE" se suelen utilizar en las vistas para realizar las modificaciones necesarias en las tablas subyacentes.
FOR EACH ROWindica que la función desencadenante se ejecutará una vez por cada fila afectada por el evento desencadenante. En cambio,FOR EACH STATEMENTpodría utilizarse para ejecutar la función desencadenante una vez por sentencia SQL, independientemente del número de filas afectadas.NEWyOLDson variables de registro especiales dentro de los activadores:NEWcontiene los datos de la nueva fila para las operacionesINSERToUPDATE, yOLDcontiene los datos de la fila existente para las operacionesUPDATEoDELETE.Ejemplos
1. Activador básico de inserción
Este ejemplo crea un activador que registra cada operación de inserción en la `tabla_principal` en una `tabla_de_registro`.
2. Actualizar activador con condición
Este activador actualiza el campo de fecha y hora `updated_at` de `main_table` cada vez que se modifica una fila.
3. Desencadenante complejo de auditoría
Este activador registra los cambios realizados en `main_table` en un `audit_log`, capturando tanto los datos antiguos como los nuevos para las operaciones `UPDATE`.
Consejos y buenas prácticas