Los desencadenantes en PostgreSQL son funciones de retrollamada de la base de datos que se ejecutan o disparan automáticamente cuando se produce un evento especificado en la base de datos, como una operación de `INSERT`, `UPDATE`, `DELETE` o incluso `TRUNCATE`. Se utilizan para aplicar reglas de negocio, validar datos y mantener la integridad de los datos dentro de la base de datos.
Utilización
Los desencadenantes se utilizan para automatizar tareas que deben producirse cuando ocurren eventos específicos de la base de datos, reduciendo la necesidad de intervención manual o de lógica del lado de la aplicación. Se definen mediante la sentencia `CREATE TRIGGER`, especificando el evento y la acción a realizar.
sql
CREATETRIGGER trigger_name
{BEFORE|AFTER|INSTEADOF}{INSERT|UPDATE|DELETE|TRUNCATE}ON table_name
[FOREACHROW|FOREACHSTATEMENT]EXECUTEPROCEDUREfunction_name();Con la tecnología de
En esta sintaxis, `CREAR DISPARADOR` define un nuevo disparador llamado `nombre_disparador` que ejecuta una función especificada (`nombre_función`) antes, después o en lugar del evento especificado en `nombre_tabla`. La cláusula `POR CADA FILA` indica que el desencadenante se ejecuta una vez por cada fila afectada por el evento, mientras que `POR CADA DECLARACIÓN` se ejecuta una vez por cada sentencia desencadenante, independientemente del número de filas afectadas.
Ejemplos
1. Activador básico de inserción
sql
CREATEFUNCTIONlog_insert()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(table_name, operation)VALUES('employees','INSERT');RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER log_employee_inserts
AFTERINSERTON employees
FOREACHROWEXECUTEPROCEDURElog_insert();Con la tecnología de
Este ejemplo crea un disparador que registra cada operación de inserción en la tabla "empleados" en una tabla "registro_auditoría".
2. Actualizar activador con condición
sql
CREATEFUNCTIONcheck_salary_update()RETURNSTRIGGERAS $$
BEGINIFNEW.salary <OLD.salary THENRAISEEXCEPTION'Salary cannot be decreased';ENDIF;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER prevent_salary_decrease
BEFOREUPDATEON employees
FOREACHROWEXECUTEPROCEDUREcheck_salary_update();Con la tecnología de
Este activador impide cualquier disminución del salario de los empleados, garantizando que las actualizaciones salariales sólo puedan aumentar o permanecer igual. Aquí, `NEW` y `OLD` representan los estados nuevo y antiguo de la fila sobre la que se opera, respectivamente.
3. Desencadenante de la eliminación en cascada
sql
CREATEFUNCTIONdelete_related_records()RETURNSTRIGGERAS $$
BEGINDELETEFROM orders WHERE customer_id =OLD.customer_id;RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER cascade_delete_orders
AFTERDELETEON customers
FOREACHROWEXECUTEPROCEDUREdelete_related_records();Con la tecnología de
Este ejemplo configura un desencadenante para eliminar automáticamente todos los pedidos asociados a un cliente cuando se elimina dicho cliente.
4. Ejemplo de activador en lugar de
Los activadores INSTEAD OF se suelen utilizar con vistas para realizar acciones en lugar de la operación por defecto.
sql
CREATEFUNCTIONlog_view_update()RETURNSTRIGGERAS $$
BEGININSERTINTOaudit_log(table_name, operation)VALUES('view_name','UPDATE');RETURNNULL;END;
$$ LANGUAGE plpgsql;CREATETRIGGER log_view_updates
INSTEADOFUPDATEON my_view
FOREACHROWEXECUTEPROCEDURElog_view_update();Con la tecnología de
Este activador registra los intentos de actualizar una vista en lugar de realizar la actualización.
Consejos y buenas prácticas
Define claramente las condiciones de activación. Asegúrate de que las condiciones en las que se disparan los activadores están bien definidas para evitar comportamientos inesperados.
Utiliza los desencadenantes con moderación. El uso excesivo de activadores puede dar lugar a interdependencias complejas y dificultar la depuración.
Documenta minuciosamente los desencadenantes. Proporciona documentación clara sobre lo que hace cada activador y por qué se utiliza, para futuras referencias.
Prueba a fondo. Prueba siempre los activadores en un entorno de desarrollo para asegurarte de que funcionan según lo previsto sin degradar el rendimiento.
Considera las implicaciones para el rendimiento. Los activadores complejos pueden afectar al rendimiento; contrólalos y optimízalos cuando sea necesario.
Evita la invocación recursiva. Utiliza comandos como `ALTER TABLE ... ACTIVAR DISPARO ...` para controlar la activación del disparador y evitar posibles bucles de invocación recursivos.
Los desencadenantes en PostgreSQL son funciones de retrollamada de la base de datos que se ejecutan o disparan automáticamente cuando se produce un evento especificado en la base de datos, como una operación de `INSERT`, `UPDATE`, `DELETE` o incluso `TRUNCATE`. Se utilizan para aplicar reglas de negocio, validar datos y mantener la integridad de los datos dentro de la base de datos.
Utilización
Los desencadenantes se utilizan para automatizar tareas que deben producirse cuando ocurren eventos específicos de la base de datos, reduciendo la necesidad de intervención manual o de lógica del lado de la aplicación. Se definen mediante la sentencia `CREATE TRIGGER`, especificando el evento y la acción a realizar.
En esta sintaxis, `CREAR DISPARADOR` define un nuevo disparador llamado `nombre_disparador` que ejecuta una función especificada (`nombre_función`) antes, después o en lugar del evento especificado en `nombre_tabla`. La cláusula `POR CADA FILA` indica que el desencadenante se ejecuta una vez por cada fila afectada por el evento, mientras que `POR CADA DECLARACIÓN` se ejecuta una vez por cada sentencia desencadenante, independientemente del número de filas afectadas.
Ejemplos
1. Activador básico de inserción
Este ejemplo crea un disparador que registra cada operación de inserción en la tabla "empleados" en una tabla "registro_auditoría".
2. Actualizar activador con condición
Este activador impide cualquier disminución del salario de los empleados, garantizando que las actualizaciones salariales sólo puedan aumentar o permanecer igual. Aquí, `NEW` y `OLD` representan los estados nuevo y antiguo de la fila sobre la que se opera, respectivamente.
3. Desencadenante de la eliminación en cascada
Este ejemplo configura un desencadenante para eliminar automáticamente todos los pedidos asociados a un cliente cuando se elimina dicho cliente.
4. Ejemplo de activador en lugar de
Los activadores INSTEAD OF se suelen utilizar con vistas para realizar acciones en lugar de la operación por defecto.
Este activador registra los intentos de actualizar una vista en lugar de realizar la actualización.
Consejos y buenas prácticas