2017-06-28 2 views
2

Ce déclencheur doit supprimer une ligne de la table parent qui n'est pas supprimée de la table enfant. L'erreur est dans l'image ci-dessous.Erreur lors de la suppression du déclencheur

Mon code tentative:

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

Aidez-moi s'il vous plaît

enter image description here

Répondre

2

Vous pouvez simplifier en ajoutant un CASCADE SUPPRIMER indice sur une contrainte de clé étrangère telle que

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

Puisque vous avez déjà une table, tout ce que vous devez faire est abandonner la contrainte et en recréer une nouvelle.

ALTER TABLE OrderItem DROP 
    CONSTRAINT fk_ProductID; 

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

Ce que cela signifie, est que, chaque fois que vous supprimez un enregistrement de la table des parents (produit), les dossiers des enfants de (OrderItem) seront supprimés aussi bien, de sorte que vous ne devez pas utiliser les déclencheurs, sauf si vous voulez faire un peu d'enregistrement.


Si vous êtes vraiment insistez sur l'utilisation des déclencheurs alors vous pouvez ruser un peu comme ceci:

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 

Mais encore une fois, vous devriez envisager d'utiliser ON DELETE CASCADE, son plus simple à installer, plus facile à maintenir et vous ne pouvez avoir qu'un seul déclencheur INSTEAD OF par table, donc si vous avez besoin de faire quelque chose de plus significatif, vous devrez changer celui-ci, et ajouter des frais supplémentaires.

+0

Oui Je veux que le déclencheur supprime automatiquement les enregistrements associés à la table des produits lorsque je supprime une ligne de la table des produits aidez-moi –

+0

Voir si cela aide – S4V1N

+0

Remplacer 'where ID = (sélectionner supprimé.ID de supprimé)' avec 'où ID IN (sélectionnez deleted.ID from deleted)'. La table virtuelle 'deleted' contiendra plusieurs lignes pour une instruction DELETE qui supprime plusieurs lignes. La façon dont vous l'avez écrit entraînera une erreur de 'sous-requête contient plus de 1 rangée ...' dans ce cas. –

0

Ajouter SET NOCOUNT ON comme première chose dans le corps de la gâchette (après BEGIN).