【问题标题】:Make trigger with variables work for multiple row inserts使带变量的触发器适用于多行插入
【发布时间】:2020-11-22 21:05:25
【问题描述】:

我有一个仓库数据库,想实现一个触发器,确保客户退回的产品数量不能超过售出的产品数量减去之前退回的产品数量。

它适用于 RETURNS 表中的一次插入,但如果我一次插入多行,则会出现错误。

我该如何解决这个问题?

谢谢!

受影响的表是

  • SALES_ITEMS(产品、销售、SALES_QUANTITY)
  • 退货(IDRETURN、产品、销售、退货数量)
CREATE TRIGGER tr
ON Returns
AFTER UPDATE, INSERT
AS
BEGIN
    DECLARE @product INTEGER;
    DECLARE @sale INTEGER;

    SET @product = (SELECT PRODUCT FROM Inserted); 
    SET @sale = (SELECT SALE FROM Inserted); 

    IF (SELECT SUM(r.RETURN_QUANTITY) 
        FROM RETURNS r 
        WHERE r.PRODUCT = @product 
          AND r.SALE = @sale) > (SELECT s.SALES_QUANTITY 
                                 FROM SALE_ITEMS s 
                                 WHERE s.PRODUCT = @product AND s.SALE = @sale)
    BEGIN
        ROLLBACK TRANSACTION;
    END
END

【问题讨论】:

  • 什么错误???
  • 您需要将您的思维转换为基于集合的思维... SQL Server 中的触发器使用您使用的 Inserted 和 Deleted 伪表,就像您在任何其他查询中使用任何其他表一样。

标签: sql sql-server triggers sql-insert


【解决方案1】:

嗯。 . .这有点复杂。一种方法是将退货和销售额结合起来,看看是否有退货超过销售额的情况:

if exists (select 1
           from RETURNS r join
                inserted i
                on r.PRODUCT = i.product and r.SALE = i.sale join
                sales_items si
                on si.product = i.product and si.sale = i.sale
           group by r.product, s.sales_quantity
           having sum(r.return_quantity) > s.sales_quantity
          )
begin
    ROLLBACK TRANSACTION;
end;

【讨论】:

  • @Hackerman 。 . .你是说你可以在同一个产品上插入多行? group by 应该将每个产品的总数相互隔离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2021-06-15
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多