it-swarm.com.de

Trigger vor und nach dem Update für dieselbe Tabelle

Ich habe eine Tabelle mit 4 Spalten qty, qtydiff, price und value.

Ich will ein after update trigger, das ausgelöst wird, wenn sich die Anzahl der Zeilenzeilen ändert (mehr als eine Zeile).

Das Before trigger sollte die alten Werte von der Menge lesen und speichern und nachdem der Trigger den alten Wert vom neuen Wert in der Spalte qty subtrahieren sollte, den Differenzwert in qtydiff abrufen und diesen mit price Spalte und aktualisieren Sie das Ergebnis in der Spalte value.

Der folgende Code ist nur ein Konzeptcode, den ich noch nicht getestet habe. Ich bin nicht sicher, ob er funktionieren würde oder nicht, aber gibt es eine Möglichkeit, vor und nach dem Update mit demselben Trigger zu arbeiten?

 CREATE TRIGGER [dbo].[Price_Modified]
       ON [dbo].[STOCK]
       BEFORE UPDATE ON STOCK
    AS BEGIN
        SET NOCOUNT ON;
        IF UPDATE (Qty) 
        BEGIN
            SELECT qty
            FROM STOCK
        END 
AFTER UPDATE
    AS BEGIN
        SET NOCOUNT ON;
        IF UPDATE (Qty) 
        BEGIN
            UPDATE Stock
            SET value = price * qtydiff
            FROM STOCK
            WHERE qtydiff = oldvalue - newvalue
        END 
    END
3
Raheel Adam

In SQL Server gibt es keinen BEFORE Trigger. Ein INSTEAD OF Trigger kann verwendet werden, um ähnliche Funktionen bereitzustellen, aber der Triggercode müsste UPDATE ausführen.

Hier kann jedoch ein AFTER - Trigger verwendet werden, indem die virtuellen Tabellen INSERTED (neu) und DELETED (alt) verwendet werden, um die für die Berechnung erforderlichen Werte abzurufen. Im folgenden Beispiel wird eine Primärschlüsselspalte mit dem Namen StockID mit einem Wert angenommen, der nicht geändert werden kann.

CREATE TRIGGER [dbo].[Price_Modified]
    ON [dbo].[STOCK]
    AFTER UPDATE
AS
SET NOCOUNT ON;
IF UPDATE (Qty) 
BEGIN
    UPDATE s
    SET value = new.price * (new.Qty - old.Qty)
    FROM STOCK AS s
    JOIN inserted AS new ON new.StockID = s.StockID
    JOIN deleted AS old ON old.StockID = s.StockID
    WHERE new.Qty <> old.Qty;
END;

GO
6
Dan Guzman