Funciones como Triggers
Ningún motor de base de datos de mérito debería estar sin la posibilidad de utilizar triggers para detectar y manejar automáticamente cambios en los datos. PostgreSQL ofrece triggers a nivel de sentencia y a nivel de registros; los que son a nivel de sentencia corren una vez por cada sentencia, en cambio los que son a nivel de registros pueden correr muchas veces, por ejemplo si hacemos un UPDATE que afecta a 1500 registros, un trigger a nivel de sentencia solo correría una vez, en cambio el de registro correría hasta 1500 veces.
Otro de los puntos importantes en este tema es la distinción que se hace entre las instrucciones BEFORE, AFTER y la INSTEAD OF en un trigger.
Un trigger que funciona con BEFORE se dispara antes de la ejecución del comando dando la oportunidad de cambiar o cancelar o manipular los datos antes que cambien, un trigger AFTER se dispara luego de la ejecución del cambio, dando la oportunidad así de obtener los datos ya modificados, este tipo de trigger es más que todo utilizado en funciones de logs y de replicación, el trigger INSTEAD OF corre en vez de la acción que normalmente se realizaría, también otra de las particularidades de este es que solamente funciona con las vistas.
Construir una Función con Trigger
Como cuando hablamos de funciones sabemos que podemos utilizar otros lenguajes para hacerlas, en el caso de las funciones como triggers también es posible utilizar casi cualquier lenguaje, sin embargo el PL/pgSQL es un favorito para cumplir estas tareas, por ello el siguiente ejemplo que veremos en la imagen estará hecho en este lenguaje, luego que veamos el ejemplo lo explicaremos detalladamente:
1. Se define la función como trigger y puede utilizarse en cualquier tabla que tenga una columna upd_ts. Se cambiará el valor de esta columna antes de hacer el retorno. Se hace el llamado en el evento BEFORE porque si se utilizara en el AFTER todos los cambios al nuevo registro serian ignorados.
2. El trigger se disparará antes que el registro sea almacenado.
3. Esta funcionalidad que está disponible solo en PostgreSQL 9.0 o superior nos permite solamente modificar los registros que efectivamente hayan sido afectados, en versiones anteriores había que hacer comparaciones entre el campo viejo y el nuevo, esto sin embargo no está soportado para el evento INSTEAD OF.
4. Ligamos el Trigger a la tabla.
Con esto terminamos este tutorial donde hemos visto como crear un Trigger que será implementado en una función, adicionalmente de saber que eventos que podemos utilizar cuando los necesitemos.