我有两张桌子:
产品:
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])
答案 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
当触发器正常时,这将会通过。