Re: Ajuda com trigger

From: Rafael Fialho <rafafialho6(at)gmail(dot)com>
To: Eloi Ribeiro <eloi(at)eloiribeiro(dot)eu>
Cc: "pgsql-pt-geral(at)lists(dot)postgresql(dot)org" <pgsql-pt-geral(at)lists(dot)postgresql(dot)org>
Subject: Re: Ajuda com trigger
Date: 2020-06-18 19:53:21
Message-ID: CALzj9GdH27Yi+5BXgnnEAO2JNiE=hAb-2J=vkS-ymh+p7a4Xiw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-pt-geral

Em qui., 18 de jun. de 2020 às 13:35, Eloi Ribeiro <eloi(at)eloiribeiro(dot)eu>
escreveu:

> Bom dia a todos aqui na lista,
>

Boa tarde!

> Alguém me poderia ajudar com o seguinte trigger.
> [ ...]
> IF NEW.x <> OLD.x THEN
>

> Aqui temos um pequeno problema: como suas colunas são boolean sem default,
o default delas é null. Isso prejudica essa comparação quando um dos
valores é nulo.
Qualquer comparação entre nulo com qualquer coisa retorna nulo, então não
está satisfazendo a condição.
Você pode usar coalesce para tratar os 2 lados e isso deve resolver o
problema: coalesce(new.x,false) <> coalesce(old.x,false)

UPDATE t2 SET x = NEW.x WHERE t2.c1 = NEW.c1; *--<<-- Esta
> e' a linha onde nessecito ajuda, de momento nao da o resultado esperado.*
>

Aqui não há nenhum problema.

Espero que funcione e ter ajudado.

[]'s

Em qui., 18 de jun. de 2020 às 13:35, Eloi Ribeiro <eloi(at)eloiribeiro(dot)eu>
escreveu:

> Bom dia a todos aqui na lista,
>
> Alguém me poderia ajudar com o seguinte trigger.
>
> Tenho 2 tabelas, t1 e t2. Ambas tem a coluna x e cada vez que x em t1
> sofre um update, o trigger deveria fazer com que t2.x tenha o mesmo valor
> que t1.x. Sabendo que t1.c1 = t2.c1. Isto deveria acontecer mesmo que t1.x
> sofra um update para que seja NULL.
> Exemplo:
>
> *-- create tables*
> CREATE TABLE t1 (
> c1 text,
> x boolean
> );
> CREATE TABLE t2 (
> c1 text,
> c2 smallint,
> x boolean
> );
>
> *-- populate tables*
> INSERT INTO t1 (c1)
> VALUES
> ('A'),
> ('B');
> INSERT INTO t2 (c1, c2)
> VALUES
> ('A',1),
> ('A',2),
> ('B',1),
> ('B',2);
>
> *-- see data*
> SELECT * FROM t1;
> SELECT * FROM t2;
>
> *-- create function*
> CREATE OR REPLACE FUNCTION fun_update_t2_x()
> RETURNS trigger
> LANGUAGE plpgsql
> AS
> $BODY$
> BEGIN
> IF NEW.x <> OLD.x THEN
> UPDATE t2 SET x = NEW.x WHERE t2.c1 = NEW.c1; *--<<--
> Esta e' a linha onde nessecito ajuda, de momento nao da o resultado
> esperado.*
> END IF;
> RETURN NEW;
> END;
> $BODY$;
>
> *-- create trigger*
> DROP TRIGGER IF EXISTS trg_update_t2_x ON t2;
> CREATE TRIGGER trg_update_t2_x
> BEFORE UPDATE
> OF x
> ON t1
> FOR EACH ROW
> EXECUTE FUNCTION fun_update_t2_x();
>
> *-- test 1 trigger*
> UPDATE t1 SET x = TRUE WHERE c1 = 'A';
> SELECT * FROM t1;
> c1 | x
> ----+---
> B |
> A | t
> (2 rows)
>
> *-- RESULTADO ESPERADO DO TRIGGER*
> SELECT * FROM t2;
> c1 | c2 | x
> ----+----+---
> A | 1 | t
> A | 2 | t
> B | 1 |
> B | 2 |
> (4 rows)
>
> *-- test 2 trigger*
> UPDATE t1 SET x = NULL WHERE c1 = 'A';
> SELECT * FROM t1;
> c1 | x
> ----+---
> B |
> A |
> (2 rows)
>
> *-- RESULTADO ESPERADO DO TRIGGER*
> SELECT * FROM t2;
> c1 | c2 | x
> ----+----+---
> A | 1 |
> A | 2 |
> B | 1 |
> B | 2 |
> (4 rows)
>
> *-- test 3 trigger*
> UPDATE t1 SET x = FALSE WHERE c1 = 'A';
> SELECT * FROM t1;
> c1 | x
> ----+---
> B |
> A | f
> (2 rows)
>
> *-- RESULTADO ESPERADO DO TRIGGER*
> SELECT * FROM t2;
> c1 | c2 | x
> ----+----+---
> A | 1 | f
> A | 2 | f
> B | 1 |
> B | 2 |
> (4 rows)
>
> Obrigado.
>
> Eloi
>
>
>

In response to

Responses

Browse pgsql-pt-geral by date

  From Date Subject
Next Message Leandro Guimarães Faria Corcete DUTRA 2020-06-18 20:36:23 Re: Ajuda com trigger
Previous Message Eloi Ribeiro 2020-06-18 10:49:40 Ajuda com trigger