使带有变量的触发器适用于多行插入

Make trigger with variables work for multiple row inserts

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

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

我该如何解决?

谢谢!

受影响的table是

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

嗯。 . .这有点复杂。一种方法是将 returns 和 sales 连接在一起,看是否存在 returns 超过 sales 的情况:

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;