同一表上的更新前后触发器

Rah*_*dam 3 trigger sql-server c#

我有一个有 4 列的表qtyqtydiffpricevalue

我想要after update trigger在 qty 行值更改(多于一行)时触发。

Before trigger应阅读,并从数量存储旧值和触发后应从新的价值上减去旧值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
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 7

BEFORESQL Server 中没有触发器。一个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
Run Code Online (Sandbox Code Playgroud)