none
Trigger por campo RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Tenho uma trigger em uma tabela e gostaria que esta trigger fosse executada somente se um campo especifico fosse atualizado:

    Por exemplo, hoje eu tenho algo do tipo

    ALTER TRIGGER [dbo].[minhatrigger]
    ON [meubanco].[dbo].[minhatrigger]
    AFTER
    UPDATE

    Ou seja a trigger é executada sempre que houver um update, independente do campo que este update ocorra, mas o que eu gostaria é escolher um campo específico.

    Att,
    Ricardo

    quarta-feira, 25 de fevereiro de 2009 17:14

Respostas

  • Ricardo,

    Acredito que este exemplo poderá te ajudar:
    1 --Criando a Table de Novos Produtos--  
    2 Create Table NovosProdutos  
    3  (Codigo Int Identity(1,1),  
    4    Descricao VarChar(10))  
    5  
    6 --Criando a Table de Histórico Novos Produtos--  
    7 Create Table HistoricoNovosProdutos  
    8  (Codigo Int,  
    9    Descricao VarChar(10))  
    10 Go  
    11  
    12 --Inserindo valores --  
    13 Insert Into Novosprodutos Values('Arroz')  
    14 Insert Into Novosprodutos Values('Arroz1')  
    15 Insert Into Novosprodutos Values('Arroz2')  
    16 Insert Into Novosprodutos Values('Arroz3')  
    17 Go  
    18  
    19 --Criando a Trigger para controle de histórico--  
    20 Create TRIGGER T_Historico  
    21 ON NovosProdutos  
    22 for update 
    23 AS   
    24  IF (Select Descricao from Inserted) <> (Select Descricao from Deleted)  
    25   BEGIN 
    26    INSERT Into HistoricoNovosProdutos (Codigo, Descricao)  
    27         SELECT Codigo, Descricao FROM INSERTED  
    28   END 
    29 Go  
    30  
    31 --Fazendo os teste --  
    32  
    33  
    34 Update NovosProdutos  
    35 Set Descricao='Arroz 4' 
    36 Where Codigo = 1  
    37 Go  
    38  
    39 Update NovosProdutos  
    40 Set Descricao='Arroz1' 
    41 Where Codigo = 2  
    42 Go 

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    • Marcado como Resposta Ricardo Muramatsu quarta-feira, 25 de fevereiro de 2009 19:53
    quarta-feira, 25 de fevereiro de 2009 19:42

Todas as Respostas

  • Ricardo,

    Como assim escolher um campo?

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 25 de fevereiro de 2009 19:29
  • Vamos supor que eu tenha uma tabela1 com dois campos, Codigo (int) e Descricao (vc50)

    Se eu der um update no campo Codigo a trigger dispara.
    Se eu der um update no campo Descrição a trigger dispara.

    A idéia seria fazer a trigger disparar somente quando houver udate no campo Codigo, ou seja eu gostaria de fazer zilhões de updates no campo Descricao sem disparar a trigger e somente quando eu precisar fazer um update no campo Codigo disparar a trigger.
    A grosso modo seria como se eu tivesse uma trigger não na tabela e sim em determinado campo da tabela, sacou?

    att,
    Ricardo

    quarta-feira, 25 de fevereiro de 2009 19:36
  • Ricardo,

    Acredito que este exemplo poderá te ajudar:
    1 --Criando a Table de Novos Produtos--  
    2 Create Table NovosProdutos  
    3  (Codigo Int Identity(1,1),  
    4    Descricao VarChar(10))  
    5  
    6 --Criando a Table de Histórico Novos Produtos--  
    7 Create Table HistoricoNovosProdutos  
    8  (Codigo Int,  
    9    Descricao VarChar(10))  
    10 Go  
    11  
    12 --Inserindo valores --  
    13 Insert Into Novosprodutos Values('Arroz')  
    14 Insert Into Novosprodutos Values('Arroz1')  
    15 Insert Into Novosprodutos Values('Arroz2')  
    16 Insert Into Novosprodutos Values('Arroz3')  
    17 Go  
    18  
    19 --Criando a Trigger para controle de histórico--  
    20 Create TRIGGER T_Historico  
    21 ON NovosProdutos  
    22 for update 
    23 AS   
    24  IF (Select Descricao from Inserted) <> (Select Descricao from Deleted)  
    25   BEGIN 
    26    INSERT Into HistoricoNovosProdutos (Codigo, Descricao)  
    27         SELECT Codigo, Descricao FROM INSERTED  
    28   END 
    29 Go  
    30  
    31 --Fazendo os teste --  
    32  
    33  
    34 Update NovosProdutos  
    35 Set Descricao='Arroz 4' 
    36 Where Codigo = 1  
    37 Go  
    38  
    39 Update NovosProdutos  
    40 Set Descricao='Arroz1' 
    41 Where Codigo = 2  
    42 Go 

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    • Marcado como Resposta Ricardo Muramatsu quarta-feira, 25 de fevereiro de 2009 19:53
    quarta-feira, 25 de fevereiro de 2009 19:42
  • Opa era isso mesmo, muito obrigado.

    Att,
    Ricardo
    quarta-feira, 25 de fevereiro de 2009 19:53
  • Olá,

    Apesar da questão já ter sido marcada como "respondida", deixe-me acrescentar uns detalhes:

    1) Uma TRIGGER é executada (disparada) para um evento de INSERT, UPDATE ou DELETE de uma tabela e não de uma coluna.

    2) O que pode ser feito é tratar dentro do código da TRIGGER se determinada coluna foi manipulada (alterada por exemplo) e executar outros processos ou não, dependendo da coluna manipulada.

    3) Procure utilizar as funções UPDATE() ou COLUMNS_UPDATED () para identificar se uma coluna foi alterada ou não no processo de UPDATE.

    Segue um exemplo do BOL:

    CREATE TRIGGER reminder  
    ON Person.Address  
    AFTER UPDATE   
    AS   
    IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )  
    BEGIN  
    ...  
    ...  
    ...  
    END;  
    GO  
     

    Alex Rosa, visite também http://www.keep-learning.com (Forum e Artigos interessantes)
    quarta-feira, 25 de fevereiro de 2009 21:01