web-dev-qa-db-fra.com

Déclencheur de mise à jour avant et après sur la même table

J'ai une table avec 4 colonnes qty, qtydiff, price et value.

Je veux un after update trigger qui se déclenche lorsque les valeurs des lignes de quantité changent (plusieurs lignes).

Le Before trigger devrait lire et stocker les anciennes valeurs de qty et après que le déclencheur devrait soustraire l'ancienne valeur de la nouvelle valeur sur la colonne qty, obtenir la valeur de différence dans qtydiff et multiplier cela avec price et mettez à jour le résultat dans la colonne value.

Le code ci-dessous n'est qu'un code concept que je n'ai pas encore testé, je ne suis pas sûr que cela fonctionnerait ou non, mais existe-t-il un moyen de faire fonctionner avant et après la mise à jour dans le même déclencheur?

 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

Il n'y a pas de déclencheur BEFORE dans SQL Server. Une INSTEAD OF Le déclencheur peut être utilisé pour fournir des fonctionnalités similaires, mais le code du déclencheur devrait effectuer le UPDATE.

Cependant, un déclencheur AFTER peut être utilisé ici en utilisant les tables virtuelles INSERTED (new) et DELETED (old) pour obtenir les valeurs nécessaires au calcul. L'exemple ci-dessous suppose une colonne de clé primaire nommée StockID avec une valeur qui ne peut pas être modifiée.

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