[firebase-br] TRIGGER AFTER INSERT OR UPDATE no mesmo ficheiro

Sandro Souza escovadordebits em gmail.com
Seg Ago 8 11:34:10 -03 2011


Bom dia/tarde Mário.

Nobre amigo, eu acredito que o problema é que essa trigger está alterando
registros da própria tabela a qual ela pertence, ou seja, a tabela SOCIOS, o
que causa uma nova execução dessa trigger.

Pelo sintoma que você citou, acredito que isso esteja sendo executado de
forma recursiva e sem limite, até consumir todos os recursos da máquina, a
ponto de gerar esse tipo de alerta.

Veja que a condição do sócio não ser o diretor está em comentário, o que
quer dizer que os UPDATES que estão dentro dessa trigger estão alterando
inclusive o próprio registro que iniciou o disparo dessa trigger, ou seja,
gera um laço infinito mesmo.

Tente reformular essa trigger ou deixar esse código separado em uma stored
procedure.

Se você fornecer mais dados sobre a estrutura dessa tabela e qual é a lógica
que deve ser implementada, posso te ajudar de uma forma melhor.

Espero ter ajudado mais que atrapalhado. :D

Em 8 de agosto de 2011 11:21, Mário Reis <mariodosreyx em gmail.com> escreveu:

> Caros Amigos,
>
> A partir do momento que implementei esta Trigger, comocei, lá de quando em
> vez
> a receber um "Alerta de CPU" C/actividade anormal do Firebird(2.5).
> A ideia é simples o Prop1_ID (Proponente) tem direito a acumular pontos
> para
> cada novo sócio que faça.
> A trigguer pretende automatizar esse acumular quer  em INSERT quer em
> UPDATE.
>
> Alguém pode me dizer o que tem de mal a minha
>
> CREATE TRIGGER SOCIOS_BIU_QTS FOR SOCIOS
> ACTIVE AFTER INSERT OR UPDATE
> POSITION 2
> AS
> DECLARE VARIABLE QTY INTEGER;
> DECLARE VARIABLE WSOC_ID INTEGER;
> BEGIN
>  /* Se criando Novo Registo */
>  IF (INSERTING) THEN
>   BEGIN
>      SELECT S0.QTS_ID FROM SOCIOS S0
>       WHERE S0.NOSOC_ID=NEW.PROP1_ID INTO :QTY ;
>
>        UPDATE SOCIOS S1
>           SET S1.QTS_ID=:QTY+1
>         WHERE S1.NOSOC_ID=NEW.PROP1_ID;
>         --  AND S1.DIRECTOR='N';
>   END
>
>  /* Se actualizando Registo Existente */
>  IF (UPDATING) THEN
>    -- Velho Proponente != Novo
>    IF (OLD.PROP1_ID!=NEW.PROP1_ID) THEN
>     BEGIN
>      -- 1.º Tira -1 ao Velho
>      SELECT S0.QTS_ID FROM SOCIOS S0
>       WHERE S0.NOSOC_ID=OLD.PROP1_ID INTO :QTY ;
>
>       IF (:QTY>0) THEN
>        BEGIN
>         UPDATE SOCIOS S1
>            SET S1.QTS_ID=:QTY-1
>          WHERE S1.NOSOC_ID=OLD.PROP1_ID ;
>            -- AND S1.DIRECTOR='N';
>        END
>
>      --2.º Acresce um ao Novo
>      SELECT S0.QTS_ID FROM SOCIOS S0
>       WHERE S0.NOSOC_ID=NEW.PROP1_ID INTO :QTY ;
>       IF (:QTY>0) THEN
>        BEGIN
>          UPDATE SOCIOS S1
>             SET S1.QTS_ID=(:QTY + 1)
>           WHERE S1.NOSOC_ID=NEW.PROP1_ID ;
>          -- AND S1.DIRECTOR='N';
>        END
>     END
>
> END
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista