none
Atualizar campo via trigger RRS feed

  • Pergunta

  • Pessoal, estive olhando a estrutura das triggers instead of mais ainda não cheguei numa forma de fazer o seguinte.

    Tenho uma tabela com um campo chamado processamento. Eu não tenho levantado todos os lugares ou sistemas que dão manutenção nesta tabela.

    A tabela teria uma estrutura resumida assim:

    CREATE TABLE [dbo].[Cadastro](
    	[CODI] [varchar](22) NOT NULL,
    	[NOME] [varchar](200) NULL,
    	[Processamento] [char](1) NULL,
    
    CONSTRAINT [PK_Cadastro] PRIMARY KEY CLUSTERED ( [CODI] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
    Eu gostaria de criar uma trigger nesta tabela para SEMPRE setar este campo como PROCESSAMENTO = 'S', independente de ser inclusão ou alteração.
    Neste caso seriam as famosas triggers before insert/update.

    Atenciosamente
    Danilo
    quarta-feira, 4 de novembro de 2009 10:31

Respostas


  • Danilo, Trigger são bem simples de se implementar:


    Create Trigger tgrCadastro
    On [Cadastro]
    For Insert, Update
    as

    Begin

        Update A
           set A.Processamento = 'S'
           From [Cadastro] A
                Inner Join Inserted B On A.CODI = B.CODI

    End

    GO
    Insert Into Cadastro (CODI, NOME) Values ('1', 'Teste')
    GO
    Select * from Cadastro
    GO
    Disable Trigger tgrCadastro On Cadastro
    GO
    Insert Into Cadastro (CODI, NOME) Values ('2', 'Teste2')
    GO
    Insert Into Cadastro (CODI, NOME) Values ('3', 'Teste3')
    GO
    Select * from Cadastro
    GO
    Enable Trigger tgrCadastro On Cadastro
    GO
    Update Cadastro set Nome = 'Teste3.1' Where CODI = '3'
    GO
    Select * from Cadastro
    GO


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/
    • Marcado como Resposta Danilo Rogério quarta-feira, 4 de novembro de 2009 11:40
    quarta-feira, 4 de novembro de 2009 11:02

Todas as Respostas


  • Danilo, Trigger são bem simples de se implementar:


    Create Trigger tgrCadastro
    On [Cadastro]
    For Insert, Update
    as

    Begin

        Update A
           set A.Processamento = 'S'
           From [Cadastro] A
                Inner Join Inserted B On A.CODI = B.CODI

    End

    GO
    Insert Into Cadastro (CODI, NOME) Values ('1', 'Teste')
    GO
    Select * from Cadastro
    GO
    Disable Trigger tgrCadastro On Cadastro
    GO
    Insert Into Cadastro (CODI, NOME) Values ('2', 'Teste2')
    GO
    Insert Into Cadastro (CODI, NOME) Values ('3', 'Teste3')
    GO
    Select * from Cadastro
    GO
    Enable Trigger tgrCadastro On Cadastro
    GO
    Update Cadastro set Nome = 'Teste3.1' Where CODI = '3'
    GO
    Select * from Cadastro
    GO


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/
    • Marcado como Resposta Danilo Rogério quarta-feira, 4 de novembro de 2009 11:40
    quarta-feira, 4 de novembro de 2009 11:02
  • Bom dia Fausto, a minha dúvida é se não corre o risco de ficar em "loop" ou com o chamavamos no Oracle "Trigger mutating". Porque eu mando o comando update para o banco e aí dispara a trigger e dentro de trigger eu faço update na mesma tabela.


    quarta-feira, 4 de novembro de 2009 11:15
  • Danilo, não quando a opção recursive_Triggers estiver desabilitada (é assim por Default)


    Select Name, Is_recursive_Triggers_On
      from sys.Databases
     Where Database_Id = DB_ID()


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/
    quarta-feira, 4 de novembro de 2009 11:24
  • bom dia Danilo,

    em uma instalação padrão do SQL Server, ele não permite esse comportamento de trigger recursiva.. aconselho a fazer um teste em uma máquina de testes, mas o seu update dentro da trigger não irá disparar a trigger novamente... 
    para que isso acontecece vc teria que manualmente ativar a opção Recursive Triggers Enabled nas opções do seu banco de dados.. e mesmo nesse caso, depois de 20 loops o SQL Server iria automaticamente abortar a consulta e gerar um rollback..

    abs

    Felipe Ferreira
    http://weblogs.asp.net/felipeferreira
    MCT, 2X MCITP, MCPD, 6X MCTS
    quarta-feira, 4 de novembro de 2009 11:27
  • Danilo,

    Utilizar Recursive Triggers com 20 loops de execução realmente é algo que devemos pensar, principalmente nas consequências que esta quantidade de loops poderá ocasionar no processamento dos servidores.

    Outro detalhe o nível máximo de recursividade no SQL Server é de 32 níveis, sendo assim, isso é um número que devemos respeitar e o próprio SQL Server vai considerar durante o tempo de execução o nível que poderá tratar.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 4 de novembro de 2009 11:51