Fórum Too many concurrent executions of request - Por que isso??? #50430
08/04/2005
0
Minha trigger:
Onde estou errando ????
Desde já obrigado.... :roll:
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
Curtir tópico
+ 0
Responder
Post mais votado
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.
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.
Fsflorencio
Responder
Gostei + 1
Mais Posts
12/04/2005
Joaojr
AJUDOU SIM, MUITO OBROGADO! RESOLVEU MEU PROBLEMA!
QDO PRECISAR DE UMA AJUDA É SÓ PEDIR!!! VALEU KRA! :lol:
QDO PRECISAR DE UMA AJUDA É SÓ PEDIR!!! VALEU KRA! :lol:
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)