Too many concurrent executions of request - Por que isso???

Firebird

08/04/2005

Minha trigger:
CREATE TRIGGER TRG_ALT_CAIXA_SALDOALUNO FOR TB_CAIXA ACTIVE AFTER UPDATE POSITION 0 AS DECLARE VARIABLE TOTAL_E_A FLOAT; DECLARE VARIABLE TOTAL_S_A FLOAT; BEGIN SELECT SUM(ENTRADA) FROM TB_CAIXA WHERE ID_MATRICULA = NEW.ID_MATRICULA INTO :TOTAL_E_A; SELECT SUM(SAIDA) FROM TB_CAIXA WHERE ID_MATRICULA = NEW.ID_MATRICULA INTO :TOTAL_S_A; UPDATE TB_CAIXA SET SALDOALUNO = (:TOTAL_E_A- :TOTAL_S_A) WHERE ID_CAIXA = (SELECT MAX(ID_CAIXA) FROM TB_CAIXA); END ^

Onde estou errando ????
Desde já obrigado.... :roll:


Joaojr

Joaojr

Curtidas 0

Melhor post

Fsflorencio

Fsflorencio

09/04/2005

O que acontece é que você está dando um update na tabela dentro de uma trigger after update da mesma tabela. O firebird/interbase não permite pois entraria em um loop infinito. E você também não pode usar new.SALDOALUNO = (:TOTAL_E_A- :TOTAL_S_A) pois o evento é after udate.

Neste caso eu costumo usar um generator como uma espécie de semáforo indicando se o evento já está sendo executado. Por ex:

CREATE TRIGGER TRG_ALT_CAIXA_SALDOALUNO FOR TB_CAIXA
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE TOTAL_E_A FLOAT;
DECLARE VARIABLE TOTAL_S_A FLOAT;
[b:da33371c01]DECLARE VARIABLE STATUS INTEGER;//variável de controle[/b:da33371c01]
BEGIN
[b:da33371c01]STATUS = GEN_ID( GEN_STATUS, 0 );//pegando o valor do generator
IF (STATUS = 0) THEN//se o generator não for ´0´ então a trigger já está sendo executada
BEGIN
STATUS = GEN_ID( GEN_STATUS, 1 );//mudo o status do generator[/b:da33371c01]
SELECT SUM(ENTRADA) FROM TB_CAIXA WHERE ID_MATRICULA = NEW.ID_MATRICULA INTO :TOTAL_E_A;
SELECT SUM(SAIDA) FROM TB_CAIXA WHERE ID_MATRICULA = NEW.ID_MATRICULA INTO :TOTAL_S_A;
UPDATE TB_CAIXA SET SALDOALUNO = (:TOTAL_E_A- :TOTAL_S_A)
WHERE ID_CAIXA = (SELECT MAX(ID_CAIXA) FROM TB_CAIXA);[b:da33371c01]
STATUS = GEN_ID( GEN_STATUS, -1 );//volto o status do generator
END[/b:da33371c01]
END
^

Isto funciona bem aqui comigo, mas se por acaso alguém resolver fazer uma cópia do banco de dados com esta trigger em execução por exemplo, além do risco de corrupção, pode acontecer do generator não voltar à posição 0 impedindo a trigger de ser executada, aí vc vai ter que mudar manualmente o valor do generator pra 0. Mas as chances de isto acontecer depende de como vc lida com o banco de dados.
O uso desta técnica comigo tem sido bastante satisfatória, mas só recomendo o uso dela se não houver como fazer de outra forma.

Espero ter ajudado.


GOSTEI 1

Mais Respostas

Joaojr

Joaojr

08/04/2005

AJUDOU SIM, MUITO OBROGADO! RESOLVEU MEU PROBLEMA!
QDO PRECISAR DE UMA AJUDA É SÓ PEDIR!!! VALEU KRA! :lol:


GOSTEI 0
POSTAR