【问题标题】:Add data to trigger from the last insert添加数据以从最后一次插入触发
【发布时间】:2019-05-15 22:09:38
【问题描述】:

我面临以下情况:

我创建了一个触发器,它对插入第三个表做出反应。当我插入任何数据(例如1 1 2)时,最后一个数字应该从单元格中的库存数量列中减去,这需要ID Product(如图所示)。但是我怎么知道最后添加了哪一行呢?我想首先通过选择来做到这一点,但这似乎是不可能的。现在我认为可以在光标的帮助下做到这一点,但它似乎不是最好的变体。有没有更好的变种我该怎么做?

这是我的触发器代码,但不幸的是,它每次只从第一个产品中减去 1:

CREATE TRIGGER AmountInsert ON Amount
AFTER INSERT
AS
BEGIN
    UPDATE Product
    SET Amount_On_Stock =
     (SELECT Amount_On_Stock FROM Product
    WHERE ID_Product = 1) - 1
    WHERE ID_Product = 1
END

【问题讨论】:

  • 要知道最后添加的是哪一行,您需要一个日期时间列,或者您需要一个递增的整数列。
  • @DaleBurrell,更新了问题
  • 请熟悉 inserteddeleted 伪表,因为这是您确定要更新哪些行的方式。
  • 如果取消购买会发生什么?您的仓库突然出现漏洞?您最好使用一个表格,该表格记录出于任何原因进入的内容和外出的内容(或从多个表格中提取,如购买、丢弃、交付、退货等)并通过获取来查询您的库存数量总和(当然否定的出局)。为方便起见,您可以为此编写一个视图。这样您的保险箱就可以始终拥有准确的数字并保留完整的历史记录。

标签: sql sql-server triggers


【解决方案1】:

首先需要了解的是,在 SQL Server 的触发器中,您会获得一个inserted pseudo-table and a deleted pseudo-table。您可以使用这些表来确定发生了哪些变化。

我认为以下触发器完成了您正在寻找的内容 - cmets 解释了逻辑。

CREATE TRIGGER dbo.AmountInsert ON dbo.Amount
AFTER INSERT
AS
BEGIN
  set nocount on;

  update P set
    -- Adjust the stock level by the amount of the latest insert
    Amount_On_Stock = coalesce(Amount_On_Stock) - I.Amount
  from dbo.Product P
  inner join (
    -- We need to group by ID_Product in case the same product appears in the insert multiple times
    select ID_Product, sum(Amount) Amount
    from Inserted
    group by ID_Product
    -- No need to update is net change is zero
    having sum(Amount) <> 0
  ) I
  on I.ID_Product = P.ID_Product;
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2021-09-15
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多