SQL – Nach Update Trigger – Wie fügt man timestempel hinzu, wenn Spaltenwert sich auf einen bestimmten Wert ändert

Ich möchte einen Trigger erstellen, um die Spalte zu aktualisieren

dbo.tbl_dispatching.Actual_Pickup_Time 

mit timestempel, wenn die untere Spalte auf 5 aktualisiert wird

 dbo.tbl_dispatching.Status_ID = "5" 

Und aktualisieren

 dbo.tbl_dispatching.Actual_Delivery_Time 

mit timestempel, wenn die untere Spalte auf 8 aktualisiert wird

 dbo.tbl_dispatching.Status_ID = "8" 

Ich habe dies bisher getan und nicht sicher, wie es zu vervollständigen:

 CREATE TRIGGER Delay_Timestamp ON [dbo].[tbl_dispatching] FOR UPDATE AS declare @DispatchingID int; --Primery Key of Dispatching_ID declare @Statusid int; declare @Actual_Pickup_Time datetime; declare @Actual_Delivery_Time datetime; declare @audit_action varchar(100); select @DispatchingID=i.dispatching_id from inserted i; --Primery Key of Dispatching_ID select @Statusid=i.Status_ID from inserted i; select @Actual_Pickup_Time=i.Actual_Pickup_Time from inserted i; select @Actual_Delivery_Time=i.Actual_Delivery_Time from inserted i; if @StatusID = (5) set @Actual_Pickup_Time=GETDATE(); if @StatusID = (8) set @Actual_Delivery_Time=GETDATE(); update set tbl_Dispatching(Actual_Pickup_Time,Actual_Delivery_Time) values (@Actual_Pickup_Time,@Actual_Delivery_Time) where dispatching_id = @DispatchingID go 

würde das funktionieren?

Ihr fundamentaler Fehler ist, dass Sie scheinen zu erwarten, dass der Auslöser einmal pro Zeile gefeuert wird – das ist nicht der Fall in SQL server. Stattdessen wird der Auslöser einmal pro statement ausgetriggers, und die Pseudotabellen Inserted und Deleted können mehrere Zeilen enthalten.

In einem solchen Fall ist diese Aufgabe

 select @Statusid=i.Status_ID from inserted i; 

wird eine beliebige Zeile aus der Inserted Tabelle auswählen und alle anderen Zeilen ignorieren – normalerweise nicht was du willst.

Sie müssen Ihren Trigger in einer Set-basierten Mode umschreiben – nicht erwarten, dass Inserted und Deleted nur eine einzige Zeile enthalten – sie werden nicht!

Du musst so etwas wie Code verwenden:

 CREATE TRIGGER Delay_Timestamp ON [dbo].[tbl_dispatching] FOR UPDATE AS -- Update Actual_Pickup_Time if "Status_ID" has changed to 5 UPDATE disp SET Actual_Pickup_Time = SYSDATETIME() FROM dbo.tbl_Dispatching disp INNER JOIN Inserted i ON i.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! INNER JOIN Deleted d ON d.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! WHERE i.Status_ID = 5 -- new value is 5 AND d.Status_ID <> 5 -- old value was NOT 5 -- Update Actual_Delivery_Time if "Status_ID" has changed to 8 UPDATE disp SET Actual_Delivery_Time = SYSDATETIME() FROM dbo.tbl_Dispatching disp INNER JOIN Inserted i ON i.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! INNER JOIN Deleted d ON d.DispatchId = disp.DispatchId -- use PRIMARY KEY of table! WHERE i.Status_ID = 8 -- new value is 8 AND d.Status_ID <> 8 -- old value was NOT 8