Fazer uma PerguntaFazer uma Pergunta
 

Respondidotrigger com linha dupla

  • terça-feira, 3 de novembro de 2009 19:12Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    boa tarde senhores.
    Criei o trigger abaixo para uma auditoria, porem cada vez que disparo um update na tabela, duas linhas são adicionadas na tabela de auditoria.
    Poderiam me exclarecer por que duas linhas são adicionados e não apenas uma?
    Obrigado


    CREATE

     

    TRIGGER [tr_BomRiscoPergEmis_IUD]

     

    ON BomRiscoPergEmis for INSERT,DELETE,UPDATE

    AS

     

    BEGIN

     

    -- SET NOCOUNT ON added to prevent extra result sets from

     

    -- interfering with SELECT statements.

     

    SET NOCOUNT ON;

     

    -- DISPARO DE INSERÇÃO

     

    if (select count(*) from inserted) > 0 and (select count(*) from deleted) = 0

     

    begin

     

    insert BomRiscoPergEmis_acao values ('I',getdate())

     

    end

     

    -- DISPARO DE EXCLUSÃO

     

    if (select count(*) from inserted) = 0 and (select count(*) from deleted) > 0

     

    begin

     

    insert BomRiscoPergEmis_acao values ('D',getdate())

     

    end

     

    -- DISPARO DE ALTERAÇÃO

     

    if (select count(*) from inserted) > 0 and (select count(*) from deleted) > 0

     

    begin

     

    insert BomRiscoPergEmis_acao values ('U',getdate())

     

    end

    END

    GO

Respostas

  • terça-feira, 3 de novembro de 2009 19:38Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    Senhores,
    Uma outra trigger estava sendo disparada e gerando a segunda linha.
    Agradeço a atenção.

    Obrigado.
    • Marcado como RespostaCorujao terça-feira, 3 de novembro de 2009 19:42
    •  

Todas as Respostas

  • terça-feira, 3 de novembro de 2009 19:16Fausto F. Branco Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Corujão, um Update no banco de dados é considerado pela TRigger como um Delete (registro antes do update) depois um Insert (registro depois do update), então no seu codigo é feito o Insert na tabela de auditoria 2 vezes
    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/
  • terça-feira, 3 de novembro de 2009 19:19Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    ate cogitei isto. Mas veja o resultado da tabela de apoio apos alguns update na tabela principal:

    U 2009-11-03 16:48:42.223
    U 2009-11-03 16:48:42.257
    U 2009-11-03 16:49:11.410
    U 2009-11-03 16:49:11.427
    U 2009-11-03 16:54:16.960
    U 2009-11-03 16:54:16.960

    São dois registros de update e não um de delete e outro de insert
  • terça-feira, 3 de novembro de 2009 19:29Junior Galvão - MVPMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Corujão,

    Então possível alguma condição dentro da sua trigger esta sendo identificada pelo SQL Server no Update que acaba resultando na inserção de dois registros.

    Você as condições impostas no comando IF!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
  • terça-feira, 3 de novembro de 2009 19:38Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Respondido
    Senhores,
    Uma outra trigger estava sendo disparada e gerando a segunda linha.
    Agradeço a atenção.

    Obrigado.
    • Marcado como RespostaCorujao terça-feira, 3 de novembro de 2009 19:42
    •  
  • terça-feira, 3 de novembro de 2009 19:46Fausto F. Branco Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Corujão, mas é exatamete isso... Ele passa 2 vezes, uma para Delete e outra p/ Insert e vc testa isso....

     (select count(*) from inserted) > 0 and (select count(*) from deleted) > 0









    Create Table tblTeste
    (idTeste Int Identity(1, 1),
     dsTeste VarChar(20)
    )

     

    Create Trigger trgtblTeste
     On tblTeste for INSERT,DELETE,UPDATE

    AS
    BEGIN

     select count(*) from inserted

     select count(*) from deleted
     
    End

     

    Insert Into tblTeste Values ('AAAAAAAAAAAaa')
    Go
    Update tblTeste set dsTeste = 'bbbbbbbbb'
    Go
    Delete tblTeste


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/
  • terça-feira, 3 de novembro de 2009 19:48Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Fausto, minha trigger ja faz este teste.
    Veja a trigger completa no primeiro post, la em cima.
    Ja achei o problema (vide um pouco acima). Obrigado por sua atenção.

    Abraços.
  • terça-feira, 3 de novembro de 2009 19:51Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     

    Para constar, dropei a trigger ja existente e a trigger mostrada acima passou a inserir apenas uma linha na tabela auxiliar.

    Obrigado a todos.

  • quarta-feira, 4 de novembro de 2009 0:04Junior Galvão - MVPMVPMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Fausto,

    Eu particularmente já trabalhei com diversas formas de aplicação de trigger mas eu particularmente não tive a curiosidade de observar o que ocorre quando utilizamos um Update.

    Se analisar um plano de execução com uma instrução de Update não é apresentado este comportamento de excluir o antigo registro e adicionar um novo.

    Mas eu já havia estudado o comportamento dos processos de Update e Delete.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
  • quarta-feira, 4 de novembro de 2009 13:40Corujao Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    bom dia senhores.

    Fausto e Galvão, pode ser que internamente seja feito um delete e insert quando e feita um update na tabela.
    Mas quando o trigger é disparado, apenas uma linha com 'U' é inserida na minha tabela auxiliar.
    (vide trigger no primeiro post)

    Obrigado