Usuário com melhor resposta
Trigger por campo

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
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
Todas as Respostas
-
-
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 -
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
-
-
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)