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

Edinho ed.rodrigo em gmail.com
Seg Maio 25 19:45:09 -03 2009


Obrigado à todos pelas explicações e BRIGADAO pro Sandro por
exemplificar um código.

Bom, Sandro eu implementei o codigo aqui da maneira que voce
descreveu, mas msm assim nao rodou, dz que os campos nao sao da
tabela... nao sei do que se trata , mas ja valeu a explicação do erro
do laço infinito lá!

:D

Vlw Pessoár!



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
>



-- 
- Edinho
-- Engenharia da Computação / 5º Termo
--- Araçatuba/SP




Mais detalhes sobre a lista de discussão lista