none
Recursividade de Triggers RRS feed

  • Pergunta

  • Boa tarde Pessoal,

    Tenho uma trigger for insert e update. Ao inserir um registro na tabela, a trigger dispara, faz algumas operações e depois atualiza um campo no registro inserido nesta mesma tabela que possui a trigger. Para evitar a recursividade coloquei o comando abaixo:

    IF @@nestlevel > 1 RETURN 

    @@nestlevel > 1 - indica que a trigger está sendo executada mais de uma vez, ou seja, entrou num loop. Neste caso paro a execução. Estou certa? Posso fazer este tipo de controle?

    Isto funciona para o SQL SERVER 7, 2000 e 2005? Senão funcionar, qual seria o comando equivalente as diferentes versões?

    Obrigada

    • Movido Gustavo Maia Aguiar quarta-feira, 12 de maio de 2010 22:05 (De:SQL Server - Desenvolvimento Geral)
    quarta-feira, 12 de maio de 2010 16:44

Respostas

  • Teles

    Vc esta correto vc pode usar a @@nestlevel, embora exista uma especifica para trigger @@trigger_nestlevel(), mas para que a recursividade de uma trigger funcione vc deve habilitar esta feature no DB

    ** CUIDADO ** ao habilitar esta feature no db ela vale para todas as triggers do DB em questão, uma programação com falha pode causar um loop infinito (infinito nao é por o nest level tem um limite de 32 aninhamentos) mas isto pode te causar dores de cabeça com os dados :D

    segue um exemplo para teste.

    --ativando recursividade
    exec sp_dboption 'dbTeste', 'recursive triggers', 'true'
    go
    -- tbTeste
    create table tbTeste (id int, nome varchar(10),nestlevel int)
    go
    --cria trigger
    create trigger tr_tbTeste on tbTeste for insert, update, delete
    as
    	select trigger_nestlevel()
    	if trigger_nestlevel() <= 1
    	begin
    		update	t
    		set	nestlevel = trigger_nestlevel()
    		from	tbTeste t
    			join inserted i
    				on	t.id = i.id
    	end
    go
    --populando
    insert into tbTeste values(1,'marcelo',0)
    go
    drop trigger tr_tbTeste
    drop table tbTeste

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quinta-feira, 13 de maio de 2010 11:50