sql server - Suppression de lignes de manière récursive dans une table auto-référencée à l'aide d'un CTE. Comment se déroule le processus?



sql-server triggers (1)

Je travaille sur un projet parallèle, et pour supprimer une ligne et tous ses descendants dans une table auto-référencée, j'utilise un CTE récursif comme celui-ci dans un trigger:

CREATE TRIGGER dbo.tr_Comment_Delete
    ON dbo.Comment INSTEAD OF DELETE
AS
    ;WITH IDs AS (
       SELECT id FROM DELETED
       UNION ALL
       SELECT c.id
       FROM Comment AS c INNER JOIN IDs AS i 
        ON c.parent_comment_id = i.id
    )
    DELETE FROM Comment
    WHERE id IN (SELECT id FROM IDs);
GO

Ceci est le tableau auto-référencé

Bien que ce code fonctionne comme prévu, c'est un de ces cas où vous faites quelque chose, mais vous ne savez pas très bien comment cela fonctionne.

Pour être plus précis, ce que je voudrais savoir, c'est comment en utilisant ce CTE (IDs) récursif, je suis capable d'éviter les erreurs d'intégrité référentielle lorsque j'essaie de supprimer un commentaire qui a des commentaires enfants?

Quel est le processus / l'ordre dans lequel les commentaires sont supprimés?

Prenez cette hiérarchie de commentaires à titre d'exemple:

3-> 8-> 13 

Ici le commentaire de id 3 est le commentaire racine. Le commentaire 8 est une réponse au commentaire 3, tout comme le commentaire 13 est une réponse au commentaire 8.

Comment se déroule le processus de suppression?

PS J'ai essayé d'ajouter une table dans laquelle j'ai inséré les Ids comme ils ont été calculés. Malheureusement, je ne peux pas le comprendre. Ce sont les résultats d'une telle table:

id  ins-date
3   2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037

Je suppose que vous voyez la complexité là où elle n'existe pas.

Votre erreur est:

Suppression récursive de lignes dans CTE auto-référencé

Il n'y a rien de tel que DELETE récursif. Seul SELECT peut être.

Le traitement est simple comme:

  1. Calculer toutes les lignes pour la suppression dans SELECT avec reciccile CTE

  2. DELETE les tous avec une opération

C'est tout





sql-cte