5

मेरे पास 1 है .. * उपयोगकर्ता और पोस्ट के बीच संबंध। (एक उपयोगकर्ता कई पदों है)एसक्यूएल सर्वर 2008 - एकाधिक कैस्केडिंग एफके - क्या मुझे ट्रिगर की आवश्यकता है?

पोस्ट एक FK "उपयोगकर्ता id" कहा जाता है, जिस पर उपयोगकर्ता तालिका "उपयोगकर्ता id" क्षेत्र के लिए नक्शे है।

मैं स्थापित करने के लिए इस FK कास्केड के रूप में अद्यतन/हटाने की कोशिश की, लेकिन मैं इस त्रुटि मिलती है:

'Users' table saved successfully 'Posts' table - Unable to create relationship 'FK_Posts_Users'.
Introducing FOREIGN KEY constraint 'FK_Posts_Users' on table 'Posts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

मैं एक मेज PostHelpful कहा जाता है। एक पोस्ट में कई सहायक हैं।

सहायक के पास उपयोगकर्ता के लिए एक कैस्केडिंग एफके है (इसलिए जब उपयोगकर्ता हटा दिया जाता है, तो उनकी सहायक भी हटा दी जाती हैं)।

लेकिन मुझे लगता है कि यह "एकाधिक कैस्केड पथ" के लिए शिकायत का कारण है।

क्योंकि अगर मैं उपयोगकर्ता को हटाता हूं (वर्तमान में), तो यह उनके सहायक को हटा देगा। लेकिन मैं पोस्ट करने के लिए एक कोडेड जोड़ने की कोशिश कर रहा हूं, क्या यह पोस्ट को हटा देगा, फिर उस पोस्ट के लिए सहायक की कोशिश करें और हटाएं (सहायक के रूप में भी पोस्ट करने के लिए एक कैस्केडिंग एफके है)। उस परिदृश्य में, जो एसके एसक्यूएल को चुनौती देगा?

यहाँ प्रश्न में तीन टेबल के डेटाबेस आरेख है:

enter image description here

आप देख सकते हैं, "PostHelpful" एक बच्चे को दोनों "पोस्ट" और "उपयोगकर्ता" है (FK के लिए है दोनों)।

तो मैं दोनों चाबियाँ कैस्केडिंग नहीं कर सकता? सहायक उपकरण (और उपयोगकर्ता को संदर्भित करने वाली अन्य तालिकाओं) को मैन्युअल रूप से हटाने के लिए मुझे "उपयोगकर्ता" (हटाए जाने के बाद) पर ट्रिगर की आवश्यकता है।

+0

आपको समस्या मिली है और इसे कैसे ठीक किया जाए। उपयोगकर्ता और PostHelpful के बीच कैस्केड डिलीट को हटाएं, उपयोगकर्ता को ट्रिगर जोड़ें जो 'हटाएं' पर पोस्टहेल्पफुल में हटाएं। फिर आप उपयोगकर्ता और पोस्ट के बीच कैस्केड डिलीट जोड़ने में सक्षम होना चाहिए। –

+0

@ माइकल एरिक्सन - वास्तव में? मेरा मतलब है कि यह काम करेगा, लेकिन मुझे उम्मीद थी कि यह चीजों को करने का गलत तरीका था। ट्रिगर्स को रेफरेंसियल अखंडता को लागू नहीं करना चाहिए। – RPM1984

+0

एचएम। कभी-कभी कैस्केड को संदर्भित अखंडता बाधा के हिस्से के रूप में हटाया नहीं जाता है। हटाने को संभालने के लिए एक सुविधाजनक तरीका की तरह। मैं शायद ट्रिगर या कैस्केड डिलीट का उपयोग नहीं करता। मैं एक संग्रहित प्रक्रिया लिखूंगा जो सही क्रम में हटा दें। –

उत्तर

3

यह कोई फर्क नहीं पड़ता कि SQL सर्वर कौन सा पथ चुनता है, यह इसकी अनुमति नहीं देता है ताकि यह समझौता करने की स्थिति में न उड़ाए। जब हम इस स्थिति में भाग गए, तो हमें एक ट्रिगर का सहारा लेना पड़ा।

1) त्रुटि संदेश के रूप में कहा गया है, Users_PostHelpfuls चालू पर FK बदल कोई कार्रवाई नहीं की हटाएँ।

2) जोड़ें बजाय उपयोगकर्ताओं के लिए ट्रिगर हटाएँ:

CREATE TRIGGER dbo.Users_IO_Delete 
ON dbo.Users 
INSTEAD OF DELETE 
AS 
BEGIN; 
    DELETE FROM dbo.PostHelpfuls WHERE UserId IN (SELECT UserId FROM deleted); 

    DELETE FROM dbo.Users WHERE UserId IN (SELECT UserId FROM deleted); 
END; 

अब, FK अभी भी डीआरआई लागू करेंगे, लेकिन ट्रिगर नहीं बल्कि FK बाधा से हटाने की व्यापक है।

आप उपरोक्त चरणों में पोस्ट साथ PostHelpfuls बदल सकते थे। लेकिन ऐसा करने पर कम स्वतंत्र इकाई के रिकॉर्ड को हटाने के लिए ट्रिगर का उपयोग करना सबसे अच्छा होता है। दूसरे शब्दों में, यह अधिक संभावना है कि पोस्टउपयोगकर्ता और PostHelpfulsसे PostHelpfulsउपयोगकर्ता और पोस्ट बगल में टेबल से संबंधित है के बगल में तालिकाओं के लिए संबंधित हैं।

+0

ठीक है, यह वही है जो मैंने पाया। तो अब मेरे पास एक ही बात कहने वाले तीन लोग हैं। अरे, ठीक है - चीयर्स। – RPM1984