>> 

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

Responder a