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

lazaro lazaro em usinaalvorada.com.br
Seg Maio 25 11:15:31 -03 2009


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





Mais detalhes sobre a lista de discussão lista