Tenho 2 gatilhos. triggerA
e triggerB
que atua sobre mudanças em tableA
e tableB
respectivamente. Dentro de ambos os gatilhos, quero usar a mesma função que usa as variáveis OLD
&NEW
. Eu não sei como fazer isso porque me lança o erro:
OLD hasn't been assigned yet.
The tuple structure of a not-yet-assigned record is indeterminate.
Então eu tentei atribuir null a uma variável para contornar isso e é:
old_v hasn't been assigned yet.
gatilho 1 e 2 (esta parte é comum em ambos os gatilhos):
DECLARE
added added_scores;
old_v record;
new_v record;
BEGIN
CASE TG_OP
WHEN 'INSERT' THEN
old_v = null;
new_v = NEW;
WHEN 'UPDATE' THEN
old_v = OLD;
new_v = NEW;
WHEN 'DELETE' THEN
old_v = OLD;
new_v = null;
END CASE;
select _i_compute_added_scores(TG_OP, old_v, new_v) into added;
-- some computation, return result
função:
CREATE OR REPLACE FUNCTION public._i_compute_added_scores(
tg_op_p text,
old_p anyelement,
new_p anyelement)
RETURNS added_scores AS
$BODY$
DECLARE
new_score integer;
old_score integer;
res added_scores;
BEGIN
CASE TG_OP_p
WHEN 'INSERT' THEN
new_score := new_p.score;
old_score := 0;
WHEN 'DELETE' THEN
new_score := 0;
old_score := old_p.score;
WHEN 'UPDATE' THEN
new_score := new_p.score;
old_score := old_p.score;
END CASE;
-- some more computation and return
Você precisa atribuir o tipo RECORD antes de enviá-lo como parâmetro, e uma maneira muito simples de fazer isso no seu caso seria simplesmente atribuí-lo a NEW ou OLD mesmo quando não fosse necessário, como:
Observe que agora é muito importante usar
TG_OP
e controlar quais variáveis você deve ler/usar.