2015-07-06 23:40 GMT-03:00 PAULO <[email protected]>:

> Lancto - Código_- valor_rateado
>
> 01            0001         60,00 =count= 1 ou seja, 60 / 1 = 60,00
>
> 02            0122         30,00 =count= 2 ou seja, 60 / 2 = 30,00
>
> 03            2421         20,00 =count= 3 ou seja, 60 / 3 = 20,00
>
> 04            3122         15,00 =count= 4 ou seja, 60 / 4 = 15,00
>
>
>
> Até aqui tudo 100%, então a pergunta que faço é a seguinte:
>
> Preciso dar um UPDATE em cada lancto para poder atualizar o campo
> valor_rateado, ou seja, no final todos os lancto devem estar com 15,00.
>
> O problema é que a Trigger pertence a tabela filho, então como posso ir
> atualizando a medida que ou lançando ??
>

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;

Essa trigger vai servir para INSERT e UPDATE, e uma simples modificação
para pegar OLD ao invés de NEW para DELETE.

Atenciosamente,
-- 
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a