2009-07-29 6 views
7

मैंने पदानुक्रमित बहुत अधिक उपयोग नहीं किया है, इसलिए मैं थोड़ा अनिश्चित हूं। अगर मेरी तालिका में एक पदानुक्रम है, तो मैं कैस्केडिंग डिलीट कैसे करूं? (यानी हटाना सब 'बच्चों' जब 'माता-पिता' को हटाने)मैं SQL 2008 HierarchyID डेटा प्रकार के साथ कैस्केडिंग हटा कैसे कर सकता हूं?

मुझे लगता है मैं एक CTE और HierarchyID कार्यों का उपयोग करने के लिए होता है, लेकिन यकीन है कि इसके बारे में जाने के लिए कैसे नहीं ...

उत्तर

5

ट्रिगर आधारित समाधान होगा:

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 करता है, तो यह आपके बच्चे के रिकॉर्ड को बहुत आसानी से अनाथ कर सकता है जब तक कि बहुत देर हो चुकी न हो।

3

आप चाहेंगे कि टी-एसक्यूएल में IsDescendantOf विधि को देखने के लिए। कुछ इस तरह:

घोषित @ParentNodeHID hierarchyid सेट @ParentNodeHID = [नोड आप कम से हटाने से शुरू करना चाहते हैं] HierarchyTable कहां NodeHID.IsDescendantOf (@ParentNodeHID) = 1

(HierarchyTable

हटाएँ = सारणी जहां आपकी पदानुक्रम संग्रहित)

** ध्यान रखें, इस विधि के साथ, एक नोड को स्वयं का बच्चा माना जाता है। तो, जो भी आप @ParentNodeHID में पास करते हैं, WHERE क्लॉज स्थितियों को पूरा करेगा।

बोल लेख पर एक नज़र डालें: एमएस-सहायता: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/edc80444-b697-410f-9419-0f63c9b5618d.htm

संबंधित मुद्दे