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
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 |