Articles

SQL Server Trigger efter uppdatering för ett specifikt värde

av: Dallas Snider | uppdaterad: 2015-09-10 | kommentarer (6) | relaterad: mer> Triggers

Problem

jag måste skapa en SQL Server trigger som kommer att köras när ett kolumnvärde uppdateras till ett specifikt värde. Hur kan jag göra detta?

lösning

i det här tipset visar vi dig hur du skriver T-SQL-satser som skapar en SQLServer-utlösare som kommer att köras efter att vi uppdaterat ett kolumnvärde till en specifikvärde.

i bilden nedan ser vi var vi skapar vårt exempeltabell med namnet tblTriggerTest med en primär nyckelkolumn med namnet pkID, en datumkolumn med namnet OrderApprovalDateTime och en varchar-kolumn med namnet OrderStatus. Vi fyller i tabellen med tre testposter med OrderApprovalDateTime inställd på NULL och OrderStatus inställd på ”väntande”.

skapa tabellen och infoga exempeldata

i det här exemplet vill vi att vår utlösare ska fylla i OrderApprovalDateTime med det aktuella datumet som tillhandahålls av getdate () – funktionen efter att OrderStatus har uppdaterats till ”godkänd”. T-SQL för att skapa denna utlösare visas nedan. Det är mycket viktigt att inkludera den inre anslutningen till den infogade tabellen så att endast de uppdaterade raderna påverkas. Att använda klausulen där OrderStatus=’godkänd’ av sig själv för att begränsa de uppdaterade raderna kommer faktiskt att resultera i att alla rader med ett OrderStatus-värde av godkänd uppdateras samtidigt.

skapa utlösaren

för att testa utlösaren kommer vi att utföra ett T-SQL-uppdateringsuttalande för att ställa in OrderStatus-värdet till ”godkänt” för den första raden i tabellen (pkID = 1). Efter kommandot T-SQL UPDATE kör vi sedan en T-SQL SELECT-Fråga för att se till att utlösaren körs korrekt. Utmatningen från uppdaterings-och SELECT-uttalandena visas nedan.

testa utlösaren

Observera ovan att endast den första raden hade sin OrderApprovalDateTime inställd på det aktuella datumet, vilket är vårt önskade beteende. Vi måste dock köra ett andra test för att säkerställa att rätt antal rader har uppdaterats. I vårt andra test kommer vi att utföra ett T-SQL-uppdateringsuttalande för att ställa in OrderStatus-värdet till ”godkänt” för den andra raden i tabellen (pkID = 2). När du har valt alla poster i tabellen märker du hur Ordernapprovaldatetime för den andra raden inte motsvarar Ordernapprovaldatetime för den första raden. Återigen är detta vårt önskade beteende och allt verkar bra.

testa utlösaren igen

den fullständiga koden för detta tips finns i rutan nedan.

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
nästa steg

ta några minuter för att utforska vad som händer när du ändrar den inre anslutningen eller lägger till fler kolumner i tabellen och utlöser.

också, kolla in fler tips ontriggers i SQL Server på MSSQLTips.com.

  • tvinga utlösare Avfyrningsordning i SQL Server
  • förhindra oavsiktlig uppdatering eller radera kommandon för alla rader i en SQL Server-tabell
  • revision när Triggers är inaktiverade eller aktiverade för SQL Server

Senast uppdaterad: 2015-09-10

hämta skript

nästa tipsknapp

om författaren
mssqltips författare Dallas SniderDr. Dallas Snider är biträdande Professor i datavetenskapsavdelningen vid University of West Florida och har 18+ års SQL-erfarenhet.
Visa alla mina tips
relaterade resurser

  • fler Databasutvecklartips…