Re: funcionamiento diferente en triggers

From: Felipe de Jesús Molina Bravo <felipe(dot)molina(at)inegi(dot)gob(dot)mx>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: funcionamiento diferente en triggers
Date: 2007-01-29 23:07:53
Message-ID: 1170112073.7795.100.camel@fjmb
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Una disculpa por el error. Va un copy/paste de los scripts. Al terminar
de ejecutar el script de abajo, ya tendran datos en la tabla de producto
y lugar. Si hacen un "update producto set us = '2' where idp=1"
provocará que se borren los registros de lugar y por lo tanto el
contador de producto se ponga en 0 .... y claro que el atributo "us" de
producto en '2'.....

El resultado que yo obtengo es:
- borrar registros de lugar ... OK
- Decrementa contador ... OK
- pero no me acutaliza el atributo "us" de la tabla producto a '2'

Sin embargo, si colocó el trigger que esta atado a producto AFTER UPDATE
obtengo el resultado esperado. Esto funcionaba en pgsql 7.3 pero en el 8
ya no.

Que piensan de este comportamiento? por que creen ustedes que no
actualiza "us" a 2?

No me explico este comportamiento.

Saludos y gracias de antemano

--INICIO DE SCRIPT:

DROP TABLE producto CASCADE;
CREATE TABLE producto (
idp INTEGER NOT NULL,
contador integer,
us char(1),
texto VARCHAR(50) NOT NULL,
PRIMARY KEY ( idp )
);

DROP TABLE lugar CASCADE;
CREATE TABLE lugar (
idl integer not null,
idp INTEGER NOT NULL,
texto VARCHAR(50) NOT NULL,
PRIMARY KEY ( idl, idp ),
FOREIGN KEY ( idp )
REFERENCES producto
);

drop trigger t_productos on producto;

create or replace function f_productos() returns trigger as '
begin
if old.us = 1 and new.us = 2 then
delete from lugar where idp = old.idp;
end if;
return new;
end;
' language 'plpgsql';

CREATE TRIGGER t_productos
BEFORE UPDATE ON producto
FOR EACH ROW
EXECUTE PROCEDURE f_productos();

drop trigger t_lugar on lugar;

create or replace function f_lugar() returns trigger as '
begin
if TG_OP = ''INSERT'' THEN
update producto set contador = contador + 1 where
idp = new.idp;
return new;
ELSIF TG_OP = ''DELETE'' THEN
update producto set contador = contador - 1 where
idp = old.idp;
return old;
end if;
return null;
end;
' language 'plpgsql';

CREATE TRIGGER t_lugar
AFTER INSERT OR DELETE ON lugar
FOR EACH ROW
EXECUTE PROCEDURE f_lugar();

-- insertamos un producto
insert into producto values ( 1, 0, 1, 'Producto 1' );
-- insertamos un lugar
insert into lugar values ( 1, 1, 'lugar 1 para Producto 1');
insert into lugar values ( 2, 1, 'lugar 2 para Producto 1');
insert into lugar values ( 3, 1, 'lugar 3 para Producto 1');

El lun, 29-01-2007 a las 15:02 -0300, Alvaro Herrera escribió:
> Felipe de Jesús Molina Bravo wrote:
> > El lun, 29-01-2007 a las 14:37 -0300, Alvaro Herrera escribió:
> > > Juan Martínez escribió:
> > >
> > > > Mira, la secuencia de pasos para resolver problemas en el software libre es:
> > > >
> > > > 1. Documentacion
> > > > 2. Google
> > > > 3. Comunidad de usuarios
> > > > 4. Comunidad de hackers (o desarrolladores de la apps)
> > > > 5. Codigo fuente
> > > >
> > > > Si encuentras algo que no esta bien (o no es como esperas) en el codigo
> > > > fuente, entonces ponte en contacto con la comunidad de hackers,
> > > > ciertamente, mandando el codigo correspondiente que si hace lo que
> > > > esperas o corrigiendo un posible problema.
> > >
> > > Una cosa que me fastidia es que construye un ejemplo ficticio que
> > > evidentemente no funciona, ni siquiera se da la lata de verificarlo, y
> > > espera que nosotros construyamos un ejemplo completo a partir de eso
> > > (corrigiendo los errores que comete).
> >
> > No es algo ficticio.
>
> No digo que la situacion sea ficticia. Digo que este ejemplo que
> publicaste es ficticio. Y lo es, porque en una parte hay un campo
> "usuario" y despues usas "usuarios". Y como pusiste "...." en las
> listas de campos de las tablas, no se puede hacer cut/paste de ellas
> para reproducir tu ejemplo.
>
> Son cosas menores, pero si tu no haces la vida facil a la gente que
> puede ayudarte, lo que resulta es que no te ayudan.
>
> > Y si esta verificado, si hay algo que no veo dilo y ya
>
> Me refiero a poder tomar todo un pedazo de texto, pegarlo en psql y
> verificar el comportamiento. Asi como esta, tengo que hacerle
> modificaciones que sobrepasaron mi nivel de pereza.
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Henry Interiano 2007-01-29 23:13:54 Re: Slony-I
Previous Message Leonel Nunez 2007-01-29 22:52:06 Re: ERROR: no se pudo definir los permisos del directorio «/var/lib/pgsql/Test Table Space»: Permiso denegado