web-dev-qa-db-ja.com

同じテーブルの更新前と更新後のトリガー

qtyqtydiffpricevalueの4つの列を持つテーブルがあります。

が欲しい after update triggerは、qty行の値が変更されたときに起動します(複数行)。

Before triggerはqtyから古い値を読み取って保存し、Afterトリガーはqty列の新しい値から古い値を減算し、qtydiffの差の値を取得してprice列に乗算し、value列の結果を更新します。

以下のコードは、まだテストしていない概念コードです。機能するかどうかはわかりませんが、更新の前後に同じトリガーで機能する方法はありますか?

 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

SQL ServerにはBEFOREトリガーはありません。 INSTEAD OFトリガーを使用して同様の機能を提供できますが、トリガーコードはUPDATEを実行する必要があります。

ただし、AFTERトリガーは、ここでINSERTED(新しい)およびDELETED(古い)仮想テーブルを使用して計算に必要な値を取得することで使用できます。以下の例では、変更できない値を持つStockIDという名前の主キー列を想定しています。

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