2017-07-26 87 views
0

刪除我有兩個表:SQL觸發器從另一個表

產品

Product ID | Quantity 

OrdersLines

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

當然,之前我刪除了該產品Products表,我需要從01中刪除具有該產品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表的形式,還在說:

有在相關行表(銷售訂單行)必須刪除此行之前可以刪除

我在做什麼錯在這裏?

EDIT按請求:主要約束:

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

是否有你不想使用[級聯刪除](https://stackoverflow.com/a/6260736/300836)的原因? –

+0

是的,我知道這會解決問題。然而,即時通訊做這個分配。它需要在觸發器中解決。 – Benua

+1

觸發器(稱爲'AFTER'觸發器)在表中的刪除操作之後執行,因此是錯誤消息。你需要的是一個'INSTEAD OF'觸發器,它們有點棘手。閱讀整篇文章:https://docs.microsoft.com/en-us/sql/relational-databases/triggers/dml-triggers – Alex

回答

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 

這將在觸發器正常時通過。

+0

謝謝,這解決了我的問題。只需稍加評論,我需要編寫一個額外的查詢以從產品表中刪除。 – Benua