Ajuda com trigger

From: Eloi Ribeiro <eloi(at)eloiribeiro(dot)eu>
To: "pgsql-pt-geral(at)lists(dot)postgresql(dot)org" <pgsql-pt-geral(at)lists(dot)postgresql(dot)org>
Subject: Ajuda com trigger
Date: 2020-06-18 10:49:40
Message-ID: Y2mw22-SyC6RF4vuJmOmMWa1Zl33mZzTOCtvOfbapv03JzPSiI98Kha4GCRgEaloUOBp57kpMuQLc0XeTTC2vc2VVnomds5_9Pva9n3PDuQ=@eloiribeiro.eu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-pt-geral

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

Responses

Browse pgsql-pt-geral by date

  From Date Subject
Next Message Rafael Fialho 2020-06-18 19:53:21 Re: Ajuda com trigger
Previous Message Vitor Hugo 2020-06-09 17:06:46 Re: Postgres e CentOS 8