Em 16 de novembro de 2010 14:33, Eloi Ribeiro <[email protected]> escreveu:
>
> Obrigado Osvaldo, era isso mesmo que queria fazer.
> Apenas nao funciona o ultimo UPDATE.
> Simplificando o exemplo anterior:
> --DROP TABLE sch_temp.teste;
> CREATE TABLE sch_temp.teste (id serial primary key, x int, x100 int);
> CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
> $$
> BEGIN
> IF (TG_OP = 'INSERT') THEN
> IF (NEW.x IS NOT NULL) THEN
> NEW.x100 = NEW.x*100;
> ELSE
> NEW.x = NEW.x100/100;
> END IF;
> ELSE
> IF (TG_OP = 'UPDATE') THEN
> IF (NEW.x IS NOT NULL) THEN
> NEW.x100 = NEW.x*100;
> ELSE
> IF (OLD.x100 IS NOT NULL) THEN
> NEW.x = NEW.x/100;
> END IF;
> END IF;
> END IF;
> END IF;
> RETURN NEW;
> END;
> $$ LANGUAGE plpgsql;
> DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste;
> CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR
> EACH ROW EXECUTE PROCEDURE funcao_teste();
> INSERT INTO sch_temp.teste(x) VALUES(1);
> INSERT INTO sch_temp.teste(x100) VALUES (200);
> SELECT * FROM sch_temp.teste;
> 1;1;100
> 2;2;200
> Os INSERTS funcionam na perfeição.
> UPDATE sch_temp.teste SET x = 3 WHERE x = 2;
> SELECT * FROM sch_temp.teste;
> 1;1;100
> 2;3;300
> O primeiro UPDATE também.
> UPDATE sch_temp.teste SET x100 = 200 WHERE x = 3;
> SELECT * FROM sch_temp.teste;
> 1;1;100
> 2;3;300
> Excepto este ultimo que não dispara. Porque?
> Aqui o resultado deveria ser:
> 1;1;100
> 2;2;200
> Obrigado por toda a ajuda.
> Eloi
Creio que você precisa rever quais testes devem ser feitos.
Talvez:
IF (OLD.x100 IS NOT NULL) THEN
NEW.x = NEW.x/100;
END IF;
deva, na realidade ser:
IF (NEW.x100 IS NOT NULL) THEN
NEW.x = NEW.x/100;
END IF;
Eu não entendi muito bem se sempre que atualizar uma coordenada a
outra deve ser automaticamente modificada ou se isto depende de alguma
outra informação ou pré-existência de dados.
Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral