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