SQL触发器从另一个表中删除

时间:2017-07-26 09:52:07

标签: sql-server tsql

我有两张桌子:

产品

Product ID | Quantity

OrdersLines

Product ID | Amount --(multiple lines with the same ID)

当然,在我从Products表中删除产品之前,我需要先从OrdersLines表中删除所有带有该产品ID的订单行。

所以我写了一个触发器来做到这一点:

CREATE TRIGGER [dbo].[atbl_Sales_Products_DTrig]
ON [dbo].[atbl_Sales_Products]
FOR DELETE
AS
BEGIN
    DELETE FROM atbl_sales_OrdersLines
    WHERE ProductID = (SELECT ProductID FROM deleted)
END

但是,当我尝试从Products表格中删除时,它仍然说:

  

在删除此行之前,必须删除相关表(Sales OrdersLines)中的行

我在这里做错了什么?

根据要求编辑:主要约束:

[dbo].[atbl_Sales_OrdersLines]  WITH CHECK ADD  CONSTRAINT 
[FK_atbl_Sales_OrdersLines_atbl_Sales_Products] FOREIGN KEY([ProductID])
REFERENCES [dbo].[atbl_Sales_Products] ([ProductID])

1 个答案:

答案 0 :(得分:2)

这种情况下的主要问题是触发器被创建为FOR DELETE触发器。所以它在删除操作后被触发 - 这会导致错误。

您应该将其创建为INSTEAD OF DELETE触发器,它将解决此问题。

第二个问题是你不应该在子查询中使用=,因为它可以返回多行。您应该使用IN运算符。

您可以在下面看到导致两个问题出错的示例。

INSERT INTO Products(ProductId, Quantity)
SELECT 1,1
UNION
SELECT 2,2
GO

INSERT INTO OrdersLines(ProductId,Amount)
SELECT 1,2
UNION
SELECT 1,3
UNION
SELECT 2,4
UNION
SELECT 2,5
GO

DELETE Products
GO

当触发器正常时,这将会通过。