ट्रिगर आधारित समाधान होगा:
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
)
EXCEPT
सुनिश्चित करता है कि हम एक अनंत पुनरावर्ती पाश में न करना पड़े। अपने स्वयं के कार्यान्वयन में, मैंने वास्तव में संदर्भ जानकारी में एक ध्वज सेट किया है कि ट्रिगर चल रहा है, फिर ट्रिगर की शुरुआत में इस ध्वज को जांचें और फ्लैग पहले से सेट होने पर जल्दी लौट जाए। यह आवश्यक नहीं है, लेकिन प्रदर्शन के लिए थोड़ा बेहतर है।
वैकल्पिक रूप से, आप एक ट्रिगर का उपयोग नहीं करना चाहते हैं, तो आपको निम्न तर्क एक संग्रहीत प्रक्रिया में डाल सकता है:
CREATE PROCEDURE DeleteHierarchyTree
@ParentID hierarchyid
AS
DELETE FROM Hierarchy
WHERE ID.IsDescendantOf(@ParentID) = 1
यह पहली बार बहुत आसान लगता है, लेकिन ध्यान रखें है कि लोगों को इसका उपयोग करने के लिए पर याद रखें। यदि आपके पास ट्रिगर नहीं है, और कोई भी एसपी के माध्यम से पदानुक्रम तालिका पर सीधे DELETE
करता है, तो यह आपके बच्चे के रिकॉर्ड को बहुत आसानी से अनाथ कर सकता है जब तक कि बहुत देर हो चुकी न हो।