删除触发器上的错误

问题描述:

此触发器应从父表中删除未从子表中删除的行。错误在下面的图片中。删除触发器上的错误

我的代码尝试:

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

帮我请

enter image description here

您可以通过添加级联删除提示上一个外键约束,如

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语句的多行。在这种情况下,您编写它的方式会导致一个“子查询包含多于一行...”的错误。 –

SET NOCOUNT ON添加为触发器正文中的第一项(在BEGIN之后)。