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
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