La soluzione basata su trigger potrebbe essere:
CREATE TRIGGER tr_Hierarchy_DeleteChildren
ON Hierarchy
FOR DELETE
AS
DELETE FROM Hierarchy
WHERE ID IN
(
SELECT DISTINCT h.ID
FROM deleted d
INNER JOIN Hierarchy h
ON h.ObjectNode.IsDescendantOf(d.ObjectNode) = 1
EXCEPT
SELECT ID
FROM deleted
)
Il EXCEPT
assicura che noi non finire in un ciclo ricorsivo infinito. Nelle mie implementazioni, ho effettivamente impostato un flag nelle informazioni di contesto che il trigger è in esecuzione, quindi spunta questo flag all'inizio del trigger e ritorni presto se il flag è già impostato. Questo non è necessario, ma è leggermente migliore per le prestazioni.
In alternativa, se non si desidera utilizzare un trigger, si potrebbe mettere la seguente logica in una stored procedure:
CREATE PROCEDURE DeleteHierarchyTree
@ParentID hierarchyid
AS
DELETE FROM Hierarchy
WHERE ID.IsDescendantOf(@ParentID) = 1
Sembra molto più semplice in un primo momento, ma di tenere presente che le persone hanno a per ricordare questo. Se non si ha il trigger, e qualcuno fa direttamente un DELETE
nella tabella della gerarchia invece di passare attraverso l'SP, potrebbe facilmente rendere orfano il proprio figlio senza che nessuno lo sappia fino a quando non è troppo tardi.