[firebase-br] RES: [Firebase-br] Trigger com Erro

Sandro Souza escovadordebits em gmail.com
Ter Maio 26 08:33:48 -03 2009


Bom dia/tarde Lazaro.

Grande Lazaro, os campos com o prefixo NEW informam o novo valor, ou seja,
estão presentes tanto no momento anterior (BEFORE) quanto no posterior
(AFTER) do INSERT e do UPDATE.

Nesse caso, respondendo à sua dúvida, os campos com prefixo NEW não servem
apenas para receberem novos valores, servem para consultá-los também, ou
seja, o acesso é de leitura e escrita. Se você atribuir novos valores no
momento BEFORE, os novos valores são utilizados, mas independente disso você
já pode consultá-los.

Não testei ainda, mas acredito que na exclusão não constam os campos com
prefixo NEW, já que não se trata de atribuição de novos valores, assim como
na inclusão não constam os campos com prefixo OLD, já que não exitem os
valores anteriores por estar incluindo.

Com relação a isso os nossos outros colaboradores podem nos orientar da
melhor forma.

Espero ter ajudado mais que atrapalhado. :D

2009/5/25 lazaro <lazaro em usinaalvorada.com.br>

> Sandro desculpa, mas fique um pouco confuso,
> O New só deveria ser usado para inserir valore no BEFORE?
>
> -----Mensagem original-----
> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> Em
> nome de Sandro Souza
> Enviada em: segunda-feira, 25 de maio de 2009 10:16
> Para: FireBase; Edinho
> Assunto: Re: [firebase-br] [Firebase-br] Trigger com Erro
>
> Bom dia/tarde Edinho.
>
> Grande Edinho, o problema é que você está executando outro UPDATE de dentro
> de uma trigger que já foi acionada por um UPDATE, ou seja, cada novo UPDATE
> vai reexecutá-la novamente, ficando em um laço infinito até estourar em
> algum ponto.
>
> Quando uma trigger é acionada, ela já tem todas as informações referente ao
> registro/linha que está sendo incluido, alterado ou excluido, e sendo
> assim,
> não há necessidade de executar um SELECT para obter os mesmos valores,
> bastando apenas acessar os campos/colunas pelos prefixos NEW ou OLD.
>
> Alterando o seu código, fica assim:
>
> set term ^ ;
>
> CREATE OR ALTER trigger funcionario_trabalhadas_au0 for
> funcionario_trabalhadas
> active after update position 0
> AS
> declare variable trabalhadas numeric (18,0);
> declare variable entrada timestamp;
> declare variable saida timestamp;
> begin
>  -- Está tentando alterar o código do funcionário?
>  if (new.functrab_codigo <> old.functrab_codigo) then
>    -- Gera a respectiva exceção.
>    exception usuario_trocado;
>  else
>    -- Calcula a diferença de horas entre o momento de entrada e o de saída.
>    new.functrab_trabhora = extract(hour from (new.functrab_saida -
> new.functrab_entrada));
> end^
>
> set term ; ^
>
> Espero ter ajudado mais que atrapalhado. :D
>
> 2009/5/23 Edinho <ed.rodrigo em gmail.com>
>
> > Olá pessoal, estou montando uma trigger aqui e to tendo alguns problemas,
> > nao tenho certeza se estou fazendo da maneira certa, a trigger compila,
> mas
> > qnd ela é ativada ocorre um erro, bom dexa eu explicar o que quero fazer:
> >
> > Eu tenho uma tabela, na qual guardo as informaçoes de um funcionario,
> horas
> > que ele trabalhou:
> >
> > hora entrada,
> > hora saida,
> > horas que trabalhou,
> >
> > basicamente, esses sao os campos, oque eu queria é que quando o
> funcionario
> > saisse, fosse feito o calculo das qtde de horas que ele trabalhou, pra
> > isso,
> > montei a seguinte trigger:
> >
> > CREATE OR ALTER trigger funcionario_trabalhadas_au0 for
> > funcionario_trabalhadas
> > active after update position 0
> > AS
> > declare variable trabalhadas numeric (18,0);
> > declare variable entrada timestamp;
> > declare variable saida timestamp;
> > begin
> >  if (new.functrab_codigo <> old.functrab_codigo) then
> >    exception usuario_trocado;
> >    else begin
> >        select funcionario_trabalhadas.functrab_horaentrada from
> > funcionario_trabalhadas
> >        where funcionario_trabalhadas.functrab_codigo =
> new.functrab_codigo
> >        into :entrada;
> >        select funcionario_trabalhadas.functrab_horasaida from
> > funcionario_trabalhadas
> >        where funcionario_trabalhadas.functrab_codigo =
> new.functrab_codigo
> >        into :saida;
> >
> >        trabalhadas = udf_HoursBetween(:saida, :entrada);
> >
> >        update funcionario_trabalhadas set
> > funcionario_trabalhadas.functrab_trabhora = :trabalhadas
> >        where funcionario_trabalhadas.functrab_codigo =
> new.functrab_codigo;
> >
> >        end
> > end
> >
> > ela executa normalmente, porem qnd eu vou inserir algo na tabela, aconte
> > isso:
> >
> > Too many concurrent executions of the same request.
> > Too many concurrent executions of the same request.
> > At trigger 'FUNCIONARIO_TRABALHADAS_AU0' line: 20, col: 9
> > At trigger 'FUNCIONARIO_TRABALHADAS_AU0' line: 20, col: 9
> > At trigger 'FUNCIONARIO_TRABALHADAS_AU0' line: 20, col: 9
> > At trigger 'FUNCIONARIO_TRABALHADAS_AU0' line: 20, col: 9
> > At trigger 'FUNCIONARIO_TRABALHADAS_AU0' line: 20, col: 9
> >
> > Alguem pode me ajudar?
> >
> > :s
> >
> > Obrigado desde já!
> >
> > --
> > - Edinho
> > -- Engenharia da Computação / 5º Termo
> > --- Araçatuba/SP
> > ______________________________________________
> > 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
> >
> ______________________________________________
> 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
>
>
> ______________________________________________
> 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