2017-06-28 40 views
2

此觸發器應從父表中刪除未從子表中刪除的行。錯誤在下面的圖片中。刪除觸發器上的錯誤

我的代碼嘗試:

CREATE TRIGGER ProductDeleted ON Product 
for DELETE AS 
BEGIN 
    DELETE FROM OrderItem 
    WHERE ProductID = (SELECT ProductID FROM DELETED) 
END 

幫我請

enter image description here

回答

2

您可以通過添加級聯刪除提示上一個外鍵約束,如

CREATE TABLE OrderItem 
    (
    ID INT , 
    ProductID NOT NULL UNIQUE 
     CONSTRAINT fk_Products 
      REFERENCES Products (ID) ON DELETE CASCADE 
    ); 
簡化它

既然你已經有了一張桌子,你只需要做放棄約束並重新創建一個約束。

ALTER TABLE OrderItem DROP 
    CONSTRAINT fk_ProductID; 

ALTER TABLE OrderItem ADD 
    CONSTRAINT fk_ProductID 
     FOREIGN KEY (ID) 
     REFERENCES Product (ID) 
     ON DELETE CASCADE; 

這意味着什麼,就是,任何時候你刪除父表(產品)的紀錄,從(OrderItem的)子記錄將被刪除一樣,所以你不必使用觸發器,除非如果你想做一些錄音。


如果你真的堅持使用觸發器,那麼你可以調整它這樣一點點:

ALTER TRIGGER ProductDeleted on Product 
INSTEAD OF DELETE AS 
BEGIN 
SET NOCOUNT ON; 

/* First we are deleting referenced columns in OrderItem table */ 
DELETE FROM OrderItem 
where ProductID IN (select deleted.ID /* Columns from product Table */ from deleted) 

/* Now we are doing actual delete statement */ 
DELETE FROM Products where ID IN (select deleted.ID from deleted) 
END 

但再次,你應該考慮使用CASCADE DELETE,其更易於安裝,更容易維護,每個表只能有一個INSTEAD OF觸發器,所以如果你需要做更有意義的事情,你將不得不改變這一點,並增加額外的開銷。

+0

是的我希望觸發器自動刪除與產品表相關的記錄,當我從產品表中刪除一行時,請幫我 –

+0

看看是否有幫助 – S4V1N

+0

替換'where ID =(select delete.ID from deleted)'與'在哪裏ID IN(從刪除選擇deleted.ID)'。刪除的虛擬表將包含刪除多行的DELETE語句的多行。在這種情況下,您編寫它的方式會導致一個「子查詢包含多於一行...」的錯誤。 –

0

SET NOCOUNT ON添加爲觸發器正文中的第一項(在BEGIN之後)。