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