>>
>>Por que ao invés de você salvar o `valor_rateado` na tabela filha você não
>>salva isso na tabela pai? Salvar na tabela filha é até uma desnormalização.
>>Além disso, cuidado com condições de corrida (race conditions), se duas
>>transações tentarem inserir lançamentos ao mesmo tempo, dependendo de como
>>controlou sua lógica, vai ter problemas.
>>Eu faria da seguinte forma, adiciona a coluna `valor_rateado` na tabela pai,
>>e sua trigger (do tipo AFTER) ficará + ou - assim:
>> BEGIN
-- Garante que ninguém vai alterar o valor_rateado ao mesmo tempo
PERFORM 1 FROM tabela_pai p
WHERE p.codigo_pai = NEW.codigo_pai
FOR UPDATE; -- O FOR UPDATE vai bloquear a tupla, para evitar "race
conditions"
-- Atualiza o valor_rateado na tabela pai
UPDATE tabela_pai
SET valor_rateado = valor_total / (
SELECT count(*)
FROM tabela_filha f
WHERE f.cod_pai = NEW.cod_pai
)
WHERE p.codigo_pai = NEW.codigo_pai;
>> RETURN NULL;
END;
>>
Hummmm, interessante.
Seria como a dica do Targino, mas com teu código ficou mais claro e estava
preocupado em como evitar ‘race conditions’ .
E ainda tem a vantagem, que ao gravar em cada item vindo do pai, os recálculos
são executados, exatamente como pretendia.
Vou tentar desta forma, acredito que vai funcionar.
Obrigado Targino e Matheus pelas dicas.
Abraços.
Paulo.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral