【问题标题】:Trigger To Update Stock Inventory When Insert Data插入数据时触发更新库存
【发布时间】:2018-03-19 19:07:05
【问题描述】:

我看到了几篇关于此的帖子,但在我的情况下仍然存在问题。我有 2 个表 SALES_STOCKS 和 STOCKS。我想当有人从表 SALES_STOCKS(它有一个 NUMBER_STOCKS 列)购买产品时,另一个表 STOCKS 来更新 QUANTITY 列。换句话说,它应该更新 SALES_STOCKS.NUMBER_STOCKS - STOCKS.QUANTITY

这是我的数据库的截图:

My database

这是我用触发器完成的操作:

  CREATE TRIGGER trg_updStocks ON SALES_STOCKS
  AFTER INSERT AS
  BEGIN
      IF EXISTS(SELECT * FROM inserted
            LEFT OUTER JOIN deleted
            ON inserted.NUMBER_STOCKS = deleted.NUMBER_STOCKS
            WHERE deleted.NUMBER_STOCKS IS NULL)
      UPDATE STOCKS
      SET QUANTITY = QUANTITY - NEW.QUANTITY 
      WHERE ID = New.ID;
  END
  GO

【问题讨论】:

  • 您可能需要考虑一个存储过程,而不是触发器,它在单个事务中执行购买和库存更新。
  • 我同意@Andrew 我将在您的应用程序使用的一个 SP 中插入所有内容后创建一个更新命令

标签: sql sql-server triggers database-trigger


【解决方案1】:

insert 触发器中没有 deleted。 SQL Server 触发器中没有new。

我想你只是想要:

CREATE TRIGGER trg_updStocks ON SALES_STOCKS
AFTER INSERT AS
BEGIN
  UPDATE s
      SET QUANTITY = QUANTITY - i.insert_quantity 
      FROM STOCKS s JOIN
           (SELECT i.stock_id, SUM(i.quantity) as insert_quantity
            FROM inserted i
            GROUP BY i.stock_id
           ) i
           ON s.ID = i.ID;
END;

对于更新和删除触发器,您可以在deleted 表上使用类似的逻辑。

【讨论】:

  • 谢谢。这有很大帮助。你太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2018-02-20
  • 2012-07-15
相关资源
最近更新 更多