14

Creación de Triggers PostegreSQL

Tambien conocidos como disparadores. Son ejecutados o “disparados” cuando hacemos una consulta (INSERT, UPDATE o DELETE). Intervienen 4 elementos principalmente:

  1. Una Tabla
  2. Una consulta sobre una tabla
  3. Una funcion PL
  4. El propio trigger

¿Cómo funcionan?

Supongamos que tenemos una tabla llamada ‘pasajero’ donde normalmente se registra el nombre y la dirección de cualquier persona que haga uso del sistema.

Y queremos que cada vez que hacemos un nuevo registro en la tabla ‘pasajero’, se ejecute tambien un registro automatico en otra tabla donde se guarde la fecha y hora del nuevo registro así como tambien el número total de registros acumulados en ese momento.

Para ello vamos a crear dos tablas:

  • pasajeros
  • contador_pasajeros
-- Tabla PasajerosCREATETABLEpublic.pasajeros
(
    idserial,
    nombre charactervarying,
    direccion charactervarying,
    CONSTRAINT pasajeros_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
);

ALTERTABLEpublic.pasajeros
    OWNER to postgres;

-- Tabla Contador de pasajerosCREATETABLEpublic.contador_pasajeros
(
    idserial,
    fecha_registro timewithtime zone,
    contador_registro integer,
    CONSTRAINT contador_pasajeros_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
);

ALTERTABLEpublic.contador_pasajeros
    OWNER to postgres;

Ahora vamos a crear la funcion PL, que se encarga de hacer el registro en la tabla ‘contador_pasajeros’

CREATEFUNCTIONpublic.registrador()
	RETURNSTRIGGERLANGUAGE'plpgsql'AS $BODY$
DECLARE
 contador integer = 0;
 i record;
BEGINFOR i INSELECT * FROM pasajeros LOOP
	 contador := contador + 1;
	ENDLOOP;
	INSERTINTO contador_pasajeros(fecha_registro, contador_registro)
	-- now() devuelve la fecha y hora actualVALUES (now(), contador);
	RETURN NEW;
END
$BODY$

Solo nos falta crear el trigger, que conecta la función PL ‘registrador’ con la tabla ‘pasajero’

CREATE TRIGGER trigger_registrador
AFTER INSERT
ON pasajeros
FOREACH ROW
EXECUTE PROCEDUREregistrador();

Listo, entonces solo nos queda hacer pruebas. Para ello verificamos que incialmente las tablas ‘pasajeros’ y ‘contador_pasajeros’ están vacias:

-- Ejecutamos las consultas una a la vezSELECT * FROM pasajeros;

SELECT * FROM contador_pasajeros;

-- Una vez verificamos que están vacias, vamos a insertar datos-- en la tabla pasajerosINSERTINTO pasajeros(nombre, direccion)
VALUES ('Juanito Alimaña', 'Cali, Colombia');

-- Ejecutamos nuevamente las consultas en las tablas y podemos-- verificar que todo funciona correctamente
Escribe tu comentario
+ 2
Ordenar por:
3
9350Puntos

Muchas gracias por tu aporte, por fin aclare lo que en clase fue muy confuso.

1
11635Puntos

Me parece que en la función PL al declarar la variable contador la asignación de la misma para el valor de comienzo en el INTEGER en “cero” debería ser escrita así:
DECLARE
contador integer := 0;
De todas maneras me parece válido ponerlo en la práctica en PSQL y ver si se permite dicha asignación o no ya que por lo explicado en clases del curso se utiliza la combinación de " := " del " = " para distinguir el PL/pgSQL del SQL, pero la propia asignación esta contenida entre los signos de dolares.
De todas maneras probandolo se me quitará la duda y agradezco ese tutorial que ordena mejor el uso de los triggers en la DB.

1
11843Puntos

Gracias por el tutorial :3

1
3406Puntos

Lo entendí mejor, muchas gracias!

0
4225Puntos

Eres genial, demasiado bien explicado y resumido!

0
55754Puntos

Bastante concreto, muchas gracias.