Articles

O SQL Server Gatilho Após a Actualização para um Valor Específico

Por: Dallas Snider | Atualizado em: 2015-09-10 | Comentários (6) | Relacionados: Mais > Dispara

Problema

preciso criar um gatilho do Servidor SQL que será executado quando um valor de coluna é atualizada para um valor específico. Como posso fazer isto?

solução

Nesta Dica, mostramos-lhe como escrever declarações T-SQL que irão criar uma activação SQLServer que irá ser executada após actualizarmos um valor de coluna para um valor específico.

na imagem abaixo vemos onde criamos a nossa tabela de exemplo chamada tblTriggerTest com uma coluna de Chave Primária chamada pkID, uma coluna de data chamada OrderApprovalDateTime e uma coluna de varchar chamada OrderStatus. Nós povoamos a tabela com três registros de teste com o OrderApprovalDateTime definido como nulo e o OrderStatus definido como “pendente”.

Criar a tabela e inserir dados de exemplo

neste exemplo, queremos que os nossos gatilho para preencher o OrderApprovalDateTime com a data atual fornecida pela função getdate() após o OrderStatus é atualizado para “Aprovado”. O T-SQL para criar este gatilho é mostrado abaixo. É muito importante incluir a junção interna na tabela inserida para que apenas as linhas atualizadas sejam afetadas. Usando a cláusula onde OrderStatus = ‘aprovado’ por si só para limitar as linhas atualizadas irá realmente resultar em todas as linhas com um valor OrderStatus de aprovado sendo atualizado ao mesmo tempo.

criar com Êxito o gatilho

Para testar o gatilho, vamos executar uma instrução UPDATE T-SQL para definir o OrderStatus valor para “Aprovado” para a primeira linha da tabela (pkID = 1). Após o comando de atualização T-SQL, então executamos uma consulta T-SQL selecione para garantir que o gatilho seja executado corretamente. A saída das instruções de atualização e seleção é mostrada abaixo.

testar com Êxito o gatilho

Observe acima que apenas a primeira linha tinha sua OrderApprovalDateTime definida para a data atual, que é o nosso comportamento desejado. No entanto, precisamos fazer um segundo teste para garantir que o número correto de linhas foi atualizado. Em nosso segundo teste, vamos executar uma declaração de atualização T-SQL para definir o valor OrderStatus para “Aprovado” para a segunda linha da tabela (pkID = 2). Depois de selecionar todos os registros na tabela, observe como o OrderApprovalDateTime para a segunda linha não é igual a OrderApprovalDateTime para a primeira linha. Mais uma vez, este é o nosso comportamento desejado e tudo parece bem.

testar novamente a activação

o código completo para esta dica está na caixa abaixo.

use MSSQLTipsgocreate table tblTriggerTest( pkID integer Identity(1,1) primary key, OrderApprovalDateTime datetime, OrderStatus varchar(20))insert into tblTriggerTest values (NULL, 'Pending')insert into tblTriggerTest values (NULL, 'Pending')insert into tblTriggerTest values (NULL, 'Pending')select * from tblTriggerTestgocreate trigger trTriggerTest on tblTriggerTestafter updateasbegin set nocount on; update tblTriggerTest set OrderApprovalDateTime=getdate() from tblTriggerTest t inner join inserted i on t.pkID=i.pkID and i.OrderStatus='Approved'endgoupdate tblTriggerTest set OrderStatus='Approved' where pkID=1goselect * from tblTriggerTestgoupdate tblTriggerTest set OrderStatus='Approved' where pkID=2goselect * from tblTriggerTestgo
Próximos Passos

Demorar alguns minutos para explorar o que acontece quando você alterar o INNER JOIN ou adicionar mais colunas à tabela e disparar.

também, Confira mais dicas sobre escavadores no servidor SQL em MSSQLTips.com.

  • Forçar o Gatilho de Disparo da Ordem no SQL Server
  • Evitar a marcação acidental de atualizar ou apagar os comandos de todas as linhas em uma tabela do SQL Server
  • Auditoria quando os Gatilhos são Ativados ou Desativados para SQL Server

Última actualização: 2015-09-10

obter scripts

próxima dica

Sobre o autor
MSSQLTips autor Dallas SniderDr. Dallas Snider é um Professor assistente no departamento de Ciência da Computação da Universidade da Flórida Ocidental e tem mais de 18 anos de experiência SQL.
View all my tips
Related Resources

  • More Database Developer Tips…