使带有变量的触发器适用于多行插入
Make trigger with variables work for multiple row inserts
我有一个仓库数据库,想实现一个触发器,确保客户退回的产品数量不能超过售出产品数量减去之前退回的产品数量。
它适用于 RETURNS table 中的一个插入,但如果我一次插入多行,则会出现错误。
我该如何解决?
谢谢!
受影响的table是
- SALES_ITEMS(产品,促销,SALES_QUANTITY)
- RETURNS(IDRETURN,产品,销售,RETURN_QUANTITY)
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;
我有一个仓库数据库,想实现一个触发器,确保客户退回的产品数量不能超过售出产品数量减去之前退回的产品数量。
它适用于 RETURNS table 中的一个插入,但如果我一次插入多行,则会出现错误。
我该如何解决?
谢谢!
受影响的table是
- SALES_ITEMS(产品,促销,SALES_QUANTITY)
- RETURNS(IDRETURN,产品,销售,RETURN_QUANTITY)
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;