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”.
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.
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.
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.
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
om författaren
Visa alla mina tips
- fler Databasutvecklartips…
Leave a Reply