Trigger de update

Ai Galera boa tarde

estou desenvolvendo uma aplicação que manipula muitas datas e para uma determinada situação nao consegui resolver isso na aplicação e tive que partir para uma trigger no mysql.

meu problema era calcular a diferença de uma data para outra e então joquei essa responsabilidade para o banco segue a minha trigger:
por exemplo: para calcular dt1-dt2 me retornando a quantidade em dias.

delimiter |
create trigger trg_atualiza_pago_prazo after insert on tbl_base
for each row
begin

update tbl_base set pago_prazo='N' where datediff(dt_calculo_recibo,dt_venc_parcela) <=61;

end;
|
delimiter;

o problema é o erro lancado quando insiro um dado na minha tabela base

sql.BatchUpdateException: Can't update table 'tbl_base' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

esse erro acredito ser devido a inserir o dado na tabela e sequencialmente atualiza-lo.

alguem tem alguma ideia de como posso fazer essa operação?

Você pode tentar fazer o seguinte:

delimiter |
create trigger trg_atualiza_pago_prazo after insert on tbl_base
for each row
begin

if(datediff(new.dt_calculo_recibo,new.dt_venc_parcela) <=61)
begin
set new.pago_prazo='N';
end;

end|
delimiter;

na linha 8, não sei bem se deve ser um Set ou um Select

Fala mikhas blz.

dessa forma o erro que dá é na criação da trigger

Ah sim… poe “before insert” no lugar de “after insert”

valeu pelas dicas e acrescentei novas verificações tambem.

não ficou muito elegante mais faz o que tem que ser feito

delimiter |
create trigger trg_atualiza_pago_prazo before insert on tbl_base
for each row
begin
if( new.dt_calculo_recibo <>'0000-00-00' and new.status_recibo<>'C')then
if(datediff(new.dt_calculo_recibo,new.dt_venc_parcela) <=61) then
set new.pago_prazo='S';
else if (datediff(new.dt_calculo_recibo,new.dt_venc_parcela) >=62) then
set new.pago_prazo='N';
end if;
end if;
end if;
end;
|
delimiter ;

o que acha?

Pois é, como o amigo lá em cima mostrou, utilize o SET e altere o registro recém adicionado. Da maneira que tu fizeste antes, toda vez que a trigger executasse, ela percorreria TODOS os registros comparando as datas, quando na verdade tu só precisarias verificar o registro novo.

Ah, o erro ocorreu porque tu criaste uma trigger que executava um comando que ativava a própria trigger, isso criar um loop infinito, então o MySQL trava a criação da mesma.

Uma coisa que eu te recomendaria era tirar aquele número “61” de dentro da trigger, pois, isso deixa as coisas muito fixas. O ideal é tu teres uma tabela, exemplo “configuracoes_gerais” onde podes criar um campo que contenha esse valor e que possa ser alterado pelo usuário. Aí dentro da trigger tu “buscas” o valor do campo ao invés de colocar o número diretamente. FIca bem mais flexível.

Abaixo apenas diminui umas linhas desnecessárias do código:

DELIMITE |

CREATE TRIGGER AtualizaPgtoPrazo BEFORE INSERT ON tbl_base FOR EACH ROW
BEGIN
   IF (NEW.dt_calculo_recibo <> '0000-00-00' AND NEW.status_recibo <> 'C') THEN
      SET NEW.pago_prazo = 'N';

      IF (DATEDIFF(NEW.dt_calculo_recibo, NEW.dt_venc_parcela) > 61) THEN
         SET NEW.pago_prazo = 'S';
      END IF;
   END IF;
END;

|

DELIMITER ;