2010-11-19 17 views
5

के लिए डिज़ाइन निर्णय व्यक्ति नामक एक टेबल है। जिसमें व्यक्तित्व और संपर्क है।DELETE SQL

यदि कोई व्यक्ति हटा दिया गया है तो मैं उस व्यक्ति को डीबी से और उस व्यक्ति के लिए संबंधित संपर्कों को हटाना चाहता हूं।

क्या यह एक स्टोर प्रक्रिया में डिलीट करने के लिए बेहतर अभ्यास है या क्या मेरी व्यावसायिक परत पहले पीकॉन्टैक्टडेलेट को कॉल करनी चाहिए और फिर पीपीर्सडेलेट को कॉल करें ???????

धन्यवाद नियाल

+0

बस एक सुझाव दें, लेकिन यह ऐसी चीज है जिसे किसी बिंदु पर 'उंडो' की आवश्यकता हो सकती है (यानी एक व्यक्ति को अपने सिस्टम में बहाल करें)। क्या आपने अपने व्यक्ति पर 'सक्रिय' ध्वज रखने और भौतिक हटाने के बजाय तार्किक कार्य करने पर विचार किया है? – Paddy

उत्तर

12

आप यह सोचते हैं का उपयोग कर रहे एमएस एसक्यूएल सर्वर:

आप शायद अपने विदेशी कुंजी पर ON DELETE CASCADE उपयोग करना चाहिए।

ALTER TABLE Contact 
ADD CONSTRAINT FK_PersonContact FOREIGN KEY (PersonId) 
REFERENCES Person(PersonId) ON DELETE CASCADE 

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

आप इसे विदेशी कुंजी रिश्ते संवाद, आईएनएसईआरटी और अद्यतन विनिर्देश अनुभाग, हटाएं नियम -> कैस्केड पर सेट एसक्यूएल प्रबंधन स्टूडियो में भी सेट कर सकते हैं।

बस यह सुनिश्चित करें कि अगर आप कहीं भी अपनी Contact ऑब्जेक्ट्स को अपनी व्यावसायिक परत में कैश करते हैं तो आप अपने कैश को रीफ्रेश भी करते हैं।

1

किसी भी दृष्टिकोण से ले पर एक व्यापक प्रभाव परिभाषित कर सकते हैं, डेटा लगातार राज्य में होना चाहिए। यदि आप एक ही संग्रहित प्रक्रिया में दोनों तालिकाओं पर संचालन करते हैं तो यह आसान होगा। यदि आप इसे अपने व्यवसाय में डालते हैं, तो मुझे लगता है कि आपको लेनदेन का उपयोग करना चाहिए, ताकि यदि आपके संपर्क हटाए नहीं गए हैं, तो आप व्यक्ति के रोलबैक को हटा सकते हैं।

1

यदि आप ओरेकल का उपयोग कर रहे हैं तो आपके पास कुछ विकल्प हैं।

  1. व्यक्तियों और संपर्क तालिकाओं के बीच विदेशी कुंजी को कैस्केड करने के लिए सेट करें।

  2. एक ऑन डिलीट ट्रिगर बनाएं और वहां हटाएं। यह विकल्प आपको किसी भी आवश्यक ऑडिट ट्रेल प्रविष्टियों को बनाने या किसी भी लॉग फाइल आदि को लिखने का अवसर भी देता है, जो कुछ हटाए जाने पर आवश्यक हो सकता है।

साझा करें और आनंद लें।

+0

+1 ओरेकल तक सीमित नहीं है, क्योंकि विभिन्न आरडीबीएमएस विदेशी कुंजी के लिए डिस्प्ले कैस्केड पर समर्थन करते हैं और डिलीट ट्रिगर्स – fredt

0

उस समस्या का मेरा दृष्टिकोण सामान्य सिद्धांत के रूप में कैस्केड डिलीट बाधा का उपयोग न करना है। चक्रीय संदर्भों के दौरान कैस्केडिंग डिलीटों का विचित्र प्रभाव हो सकता है। एक उत्पादन वातावरण में, एक संग्रहित प्रक्रिया के माध्यम से बाल संदर्भों को हटाने के लिए सलाह दी जाती है। जब तक आप संपर्कों को हटाने से पहले कोई महत्वपूर्ण सत्यापन नहीं कर रहे हैं, तब तक इस कॉल को व्यापार परत से बनाने की आवश्यकता नहीं है जब तक आप

+0

मुझे इतनी बुरी कल्पना है कि मुझे ऐसी स्थिति नहीं दिखाई दे सकती है जहां कैस्केडिंग डिलीट के साथ विदेशी कुंजी के चक्रीय संदर्भ हो सकते हैं। मुझे लगता है कि हटाएं <-> सेट नल (या सेट डिफ़ॉल्ट) अधिक आम है। –

+0

हाय आर्टो, अपनी कल्पना में मदद करने के लिए मास्टर टेबल "सेल्समैन" और बाल तालिका "ऑर्डर" मान लीजिए। ऑर्डर तालिका में "PrimarySalesManId" और "SecondarySalesManId" शामिल है। अब यदि आप मास्टर टेबल से रिकॉर्ड को हटाना चाहते हैं और कैस्केड डिलीट के साथ, आप हटाने की अपेक्षा कैसे करते हैं? क्या इसने सहायता की? – Hunter

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