[Pgsql-ayuda] Trigers en postgres

Gunnar Wolf gwolf@gwolf.cx
Thu, 30 Oct 2003 17:39:01 -0600


Dimas Ayala dijo [Thu, Oct 30, 2003 at 05:10:27PM -0800]:
> Estoy usando postgresql 7.3.2
> 
> Es la primera ves que trabajo con esta DB.
> Ya tengo mis tablas y los accesos al server atraves del ODBC pero lo que
> quiero implemetar el la parte de los Trigers.
> 
> Pero no tengo ni idea por donde empesar.
> Me podrian dar un ejemplo para crear un triger que acutalice una ralacion de
> uno a muchos.
> Cuando de aga un UPDATE en la tabla principal
> 
> O alguna direccion donde se pueda buscar es informacion en español.

http://www.postgresql.org/docs/7.3/static/plpgsql.html

Un ejemplo simple: Digamos que quieres un trigger siempre que haya un
update. Este trigger revisará que el campo 'nombre' de la tabla
'tabla' no sea 'Fulano', sale? 

Primero, creas la función que lo revise. Esta función va a recibir
(sin que tú se lo declares) el registro en cuestión en NEW.

CREATE OR REPLACE FUNCTION no_permitir_fulano() RETURNS TRIGGER AS
'BEGIN
    IF NEW.nombre = ''Fulano'' THEN
       RAISE EXCEPTION ''No acepto el nombre Fulano. Vete a volar.'';
    END IF;
    RETURN NEW;
END;' LANGUAGE 'plpgsql';

Y después, amarras esta función como trigger al hacer update a la
tabla: 

CREATE TRIGGER no_permitir_fulano BEFORE UPDATE ON tabla FOR EACH ROW
    EXECUTE PROCEDURE no_permitir_fulano();

Y ya.

Ahora... Lo estás creando sólo sobre la actualización. Podrías
insertar un nuevo registro con el nombre Fulano. Si es lo que quieres,
al crear el trigger lo haces 'before update or insert'. Podrías
también modificar los datos a guardar - por ejemplo, en vez de marcar
un error con RAISE EXCEPTION, podrías cambiar el nombre, poniendo en
vez de esa línea:

NEW.nombre='Poco imaginativo';

y así al regresar NEW regresaría valores diferentes.

...O... Bueno, posibilidades básicamente infinitas. pl/pgsql es un
lenguaje completo y bastante poderoso, aunque a veces algo incómodo. 

Saludos,

-- 
Gunnar Wolf - gwolf@gwolf.cx - (+52-55)5630-9700 ext. 1366
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF