¿Qué son los "thrillers" o disparadores en bases de datos?
Los "thrillers", conocidos en español como disparadores, son herramientas poderosas que permiten ejecutar funciones automáticamente en respuesta a ciertas acciones en una base de datos, como inserciones, actualizaciones o eliminaciones. Implementarlos en PostgreSQL con PG Admin es una excelente manera de gestionar cambios automáticamente, como veremos en el siguiente contenido.
¿Cómo funciona un disparador?
Un disparador se activa cuando ocurre una acción específica en una tabla, como un INSERT, UPDATE o DELETE. Estos pueden ser configurados para reaccionar antes (BEFORE) o después (AFTER) de estas acciones, permitiendo modificar o registrar datos en ese momento preciso.
Paso a paso para configurar un disparador
A continuación, se detalla el proceso de creación de un disparador en una base de datos PostgreSQL para llevar un registro de las operaciones realizadas en una tabla de pasajeros:
Crear la tabla de registro:
Primeramente, necesitamos una tabla simple para almacenar las operaciones realizadas. Esta tabla podría llamarse conteo_pasajeros, con las siguientes columnas:
total: tipo INTEGER
tiempo: tipo TIMESTAMP
CREATETABLE conteo_pasajeros ( id SERIALPRIMARYKEY, total INTEGER, tiempo TIMESTAMPDEFAULTCURRENT_TIMESTAMP);
Modificar la función de registro:
Supongamos que ya existe una función que desea contabilizar el número de pasajeros. Modifica la función para insertar en la tabla recién creada cada vez que se realiza un INSERT.
CREATEORREPLACEFUNCTION registrar_passenger()RETURNSTRIGGERAS $$
BEGININSERTINTO conteo_pasajeros (total)VALUES(NEW.total);RETURN NEW;END;$$ LANGUAGE plpgsql;
Crear el disparador:
Ahora, creamos un disparador para que se ejecute justo después de un INSERT en la tabla de pasajeros.
CREATETRIGGER after_insert_passenger
AFTERINSERTON pasajeros
FOR EACH ROWEXECUTEPROCEDURE registrar_passenger();
Configurar un disparador con PG Admin
La interfaz visual de PG Admin facilita el manejo de disparadores y funciones. Aquí algunos pasos para crear un disparador usando esta herramienta:
Accede al editor de funciones: Puedes modificar y crear funciones fácilmente a través de la interfaz.
Script de disparador: Usar el script adecuado para relacionar la función con la tabla deseada.
Validar la operación: Siempre valida y prueba tus scripts en un ambiente seguro para evitar errores en producción.
Superando errores comunes con disparadores
Al implementar disparadores, podrían surgir errores. Uno común es el error de retorno del disparador, indicando que no se devuelve el valor esperado. Ajustar el retorno con la variable global NEW asegure que el cambio es válido y que se refleja correctamente en la base de datos.
RETURN NEW;
Para evitar problemas, asegúrate que tus funciones y sus retornos estén correctamente definidos dentro de sus contextos respectivos.
Motiva a seguir aprendiendo
Este método de trabajo ilustra cómo un concepto teórico, como el uso de disparadores, se traduce en un mecanismo práctico para automatizar y controlar operaciones de bases de datos. A medida que profundices en el uso de SQL y el manejo de bases de datos, verás cómo estos conocimientos amplían tus capacidades y te preparan para enfrentar desafíos más complejos.
Sigue explorando y experimentando! La práctica y la continua curiosidad son esenciales para dominar la gestión eficiente de bases de datos. Con los disparadores, puedes crear soluciones inteligentes y automatizadas que optimicen tus futuros proyectos.
Está sumamente buena la clase aunque es mucha información que se va sumando con cada nueva, hay que ir con calma y repasando-aplicando cada cosa para ir al ritmo. ¡Saludos!
hay mucha información en esta clase
23. Triggers
Para la creación de triggers se debe hacer los siguiente
Crear la función que activará el evento. Para ello se debe tomar los siguientes aspectos:
En la declaración de la función, en la sección del retorno se debe indicar que es tipo triggers es decir RETURNS TRIGGER.
Luego indicar en que lenguaje está escrito es decir LANGUAE 'plpgsql'
La función tipo triggers debe retornar los valores OLD acepta lo viejo o NEW acepta lo nuevo. Sí se retorna VOID en nuestra función de tipo triggers no aceptamos cambios es decir RETURN NEW;
Tanto NEW como OLD son un objeto de tipo record y contiene dentro de si el registro, es decir se puede acceder a los campos NEW.campo_nombre del registro
DROPFUNCTIONIFEXISTScount_on_insert_pasajero()CASCADE;CREATEORREPLACEFUNCTIONcount_on_insert_pasajero()RETURNSTRIGGERLANGUAGE'plpgsql'AS $BODY$
DECLARE contador integer:=0; rec record;BEGINFOR rec INSELECT*FROM pasajero LOOPcontador:= contador +1;ENDLOOP;RAISENOTICE'cantidad de registros: %', contador;--insert record on conteo_pasajero
INSERTINTOpublic.conteo_pasajero(total_pasajero,hora_conteo)VALUES(contador,now());RETURNNEW;END;$BODY$
Lo siguiente será crear la regla que estará a la escucha del evento para disparar el triggers, para ello se deberá tomar los siguientes aspectos.
CREATE TRIGGER name_trigger name_event ON name_table FOR EACH ROW EXECUTE PROCEDURE name_procedure;
En la primera sección cuando declaramos el trigger debemos indicar en que momento en que se debe disparar el trigger:
CREATE TRIGGER name_trigger name_event ON name_table en el name_event allí puede ir alguno de estos tres parámetros para llamar la ejecución del trigger, estos son:
BEFORE = antes,
AFTER=luego,
INSTEAD OF = hacer esto, en vez de lo que iba a hacer el motor de bases de datos.
FOR EACH ROW EXECUTE PROCEDURE name_procedure indica que es para registro o fila de nuestra tabla
Creo que esta clase fue más revuelta de lo necesaria. De manera muy sencilla:
Imaginemos que tenemos una tienda y vendemos celulares.
Por cada compra que tenemos, usamos un trigger para indicar que se compró un celular, al momento en que ingresa dinero en nuestro negocio por la venta, se dispara el trigger para indicar que un celular se fue de nuestro stock. En vez de hacerlo de forma manual, es de forma automática.
muy buena explicación! gracias
Me gusta tu explicación
¿Que son los triggers?
En este contexto, los triggers, al igual que las tablas, son objetos en los cuales podemos programar unas instrucciones con el fin de que se disparen (he ahí su nombre) cuando haya un evento (cambio) en la tabla relacionada. No puede haber trigger sin ser relacionada a una tabla.
Los cambios que puede tener una tabla pueden ser (update, insert, delete).
¿Para qué necesitamos los triggers?
Un ejemplo claro sería, que como administrador de la base de datos, necesitamos tener un control y saber que usuarios han estado interactuando con la base de datos disparando dichos eventos.
¿Qué acciones puede realizar un trigger?
Un trigger puede dispararse ya sea antes, después o en lugar de, de un evento. Por ejemplo: Un usuario al ingresar datos a una tabla por medio del comando Insert, el trigger puede ejecutarse justo antes almacenando en otra tabla información relacionada sobre. ¿quien lo hizo?, la hora, cantidad de datos agregados, etc. Y se hará de forma automática
También se puede por ejemplo antes de ejecutar el comando update, hacer una copia de respaldo.
Usualmente los triggers se relacionan con el mantenimiento y administración de las bases de datos.
Hola, sólo una cosa: SI el trigger registra información sobre la modificada en una tabla, no puede ser BEFORE, sólo se podrá AFTER porque no puede registrar una modificación que no se ha hecho.
esta explicación me ayudo mucho, gracias
 CASCADE; en ocasiones para borrar una función de tipo triggers nos arrojará error porque de esta función dependen otros objetos y debemos utilizar CASCADE
Gracias por el tip.
Los triggers son de gran ayuda, ya que permiten poblar bitácoras (por ejemplo) al momento de realizar inserts o updates dentro de tablas contenidas dentro de nuestro sistema. Su estructura es:
Creación de función con tipo de RETURN TRIGGER.
Creación de trigger asociado a una acción y momento concreto sobre una tabla [AFTER, BEFORE, INSTEAD] [UPDATE,INSERT,DELETE,TRUNCATE]
Resulta muy difícil llevar la secuencia al profesor.
También conocidos como disparadores. Permiten ejecutar funciones dependiendo de acciones que se ejecuten dentro de una DB.
Insert.
Update.
Delete.
Primero validamos la función, y que podamos guardar datos en una nueva tabla que hemos creado, para este caso se llamará 'passenger_counter'. Seleccionamos en el menú desplegable las funciones, la función que vamos a editar, en este caso es testPL, y añadimos la función para añadir la cantidad de pasajeros.
Ya que funciona, ahora la función no puede devolver un tipo de dato integer, sino un tipo de dato trigger. Elíminamos el RETURN porque al ser un trigger no returna ningún tipo de dato.
Borramos la función anterior con DROP FUNCTION y volvemos a crear la nueva función con el retorno de dato de tipo trigger.
Para crear un trigger tenemos 3 tipos de disparadores
BEFORE: Antes de que se hagan los cambios.
AFTER: Después que se hagan los cambios.
INSTEAD OF: En vez de hacer los cambios.
Y ahora creamos el trigger de la siguiente manera:
CREATETRIGGER my_trigger // Creamos el trigger y le ponemos el nombre my_triggerAFTERINSERT// Después de insertarON passenger // En la tabla pasajeroFOREACHROW// Para cada filaEXECUTEPROCEDURE"testPL"();// Ejecutar el procedimiento/función "testPL"()
Ahora, al momento de crear una fila nos arrojará un error, ¿por qué? porque el trigger tiene que retornarnos que se ha creado un dato.
Primero hay que eliminar los triggers y las funciones, como la función es un trigger, se encuentra en el menú desplegable "trigger functions".
Vuelve y se crea la función, y el trigger con el siguiente código.
DROPFUNCTIONpublic."testPL"();CREATEFUNCTIONpublic."testPL"()RETURNS trigger
LANGUAGE'plpgsql'COST100VOLATILENOTLEAKPROOFAS $BODY$DECLARErec record;counter integer :=0;BEGINFOR rec INSELECT*FROM passenger LOOPcounter:= counter +1;ENDLOOP;INSERTINTOpassenger_counter(total, time)VALUES(counter,now());RETURNNEW;// NEW es para retornar los datos nuevos que se están ingresando, OLD retorna los valores antiguos. Como estamos insertando valores, se necesita retornar los datos que estamos ingresandoEND$BODY$;ALTERFUNCTIONpublic."testPL"()OWNERTO postgres;CREATETRIGGER my_trigger
AFTERINSERTONpublic.passengerFOREACHROWEXECUTEPROCEDUREpublic."testPL"();
RETO CREAR UN TRIGGER PARA CUANDO SE BORRE UN DATO DE LA TABLA.
No necesitamos crear una función de más, simplemente usamos la función anterior para que cuente los registros, y que se ejecute después que se borre un registro.
Gran resumen. Saludos!
No era necesario eliminar el trigger y volver a crear todo ya que el tipo de retorno definido era el mismo.
Esta clase estuvo super compleja...se que esta de parte nuestra buscar mas informacion...creo que la estructura de este capitulo no fue el mejor para explicar esta leccion.
El profe al final… Viste lo fácil?
Si es fácil, tocará ver el tema en otro lado porque aquí lo fácil estuvo bastante enredado.
jajajajaja. Si, ademas de que el profe primero te hace crear triggers y luego hay que borrarlo para agregar otro cambio que bien pudo haber incluido desde el principio.
el se enreda solo....
Para los que preguntan cuál es la diferencia entre una función y un procedimiento y en qué casos usar uno u otro:
Una función generalmente se usa cuando necesitamos obtener un valor. ya sea un valor único; como un valor MAX, MIN o el resultado de un cálculo; y normalmente no actualiza información en la BD (insert, update, delete) , aunque no hay nada que te impida actualizar información de una tabla dentro de una función.
Los procedimientos generalmente se usan cuando sí deseamos actualizar información (insert, update, delete) y no requerimos devolver un valor ( si acaso un valor "bandera" que indique si la actualización fue exitosa). Técnicamente tampoco hay nada que te impida devolver un valor calculado al terminar la ejecución del procedimiento (normalmente para eso se usan los parámetros de salida "out").
Los procedimientos van asociados a un trigger cuando necesitamos cachar los eventos (insert, delete, update) sobre un renglón de una tabla.
Espero haya sido claro en explicar la diferencia entre una FUNCTION y un PROCEDURE.
Saludos desde el país de los tacos al pastor.
Para mantener actualizada la tabla cont_Pasajeros ante cualquier modificacion de la tabla pasajeros