jueves, febrero 07, 2008

Triggers en PosgreSQL ( pl/ pgSQL)

Bueno ya estoy trabajando en la Base de datos de mi proyecto, y lo primero que me toco hacer en esta oportunidad fueron triggers utilizando el lengiaje plpgSQL de PosgreSQL( solo habia hecho procedimientos almacenados en SQL server con el lenguajeTransact-SQL)

dejare unos ejemplos a continuacion que seran de utilidad.

ejemplo base:

este trigger basicamente realiza una insercion en una tabla ANTES de insertar en la que se pretende realizar una insersion, o sea al tratar de insertar en la tabla LIBRO se inserta en la tabla MATERIAL .
CREATE OR REPLACE FUNCTION insertlibro() RETURNS trigger AS $insertlibro$

BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO material (cod_tipo_prestamo, material_titulo, material__contenido)
VALUES (new.cod_tipo_prestamo, new.material_titulo, new.material__contenido);
NEW.cod_material := currval('material_cod_material_seq');-- esto va solo si el PK de su tabla es un serial
RETURN NEW;
ELSIF (TG_OP ='UPDATE') THEN
UPDATE material SET cod_tipo_prestao = new.cod_tipo_prestamo, material_titulo = new.material_titulo,material__contenido = new.material__contenido
WHERE cod_material = new.cod_material;
RAISE NOTICE 'NUEVO NOMBRE: %', NEW.USUARIO_NOMBRE;
RETURN NEW;
END IF;

END;
$insertlibro$ LANGUAGE 'plpgsql';

CREATE TRIGGER insertarLibro BEFORE INSERT OR UPDATE ON libro
FOR EACH ROW EXECUTE PROCEDURE insertlibro ();

ejemplo con loop:
este trigger basicamente realiza una insercion multiple en una tabla DESPUES de insertar en la tabla LIBRO .Se insertan varios ejemplares de libro en la tabla EJEMPLARES.

CREATE OR REPLACE FUNCTION insertarEjemplar ()RETURNS TRIGGER AS $W$
DECLARE
cont int := 0;
BEGIN
LOOP
/* inicia loop*/
cont := cont + 1;

INSERT INTO ejemplar(cod_material, ejemplar_estado, ejemplar_numero_identificador)
VALUES (new.cod_material,FALSE,cont);


IF cont = NEW.libro_numero_ejemplares THEN
EXIT;/* finaliza loop solo si se cumple la condicion*/
END IF;

END LOOP;
RETURN NEW;
END;
$W$ LANGUAGE 'plpgsql';

CREATE TRIGGER insertarEjemplares AFTER INSERT ON libro
FOR EACH ROW EXECUTE PROCEDURE insertarEjemplar();

dejare la foto del modelo fisico de datos sobre el cual se estan trabajando estos triggers para su mejor comprension:

modeloFISICO


2 comentarios:

Anónimo dijo...

buen post, me ayudo bastante

Anónimo dijo...

gracias por estos post en internet, me ha ayudado a saber donde poner los RETURN