डीटीएस आयात / निर्यात विज़ार्ड का उपयोग करके डेटा आयात करते समय मैं एफके बाधाओं से कैसे निपटता हूं?


16

मैं अपने उत्पादन db से डेटा को अपने देव db पर कॉपी करने के लिए SQL सर्वर आयात और निर्यात विज़ार्ड का उपयोग करने की कोशिश कर रहा हूं, लेकिन जब मैं यह त्रुटि के साथ विफल हो जाता है "INSERT प्रतिमा FOREIGN कुंजी बाधा के साथ विवादित है" मेरे पास बहुत से 40 टेबल हैं FK बाधाओं के बारे में, क्या इससे निपटने के लिए कुछ आसान तरीका है, जिसमें एक ड्रॉप बाधा लिखना / कॉन्ट्राट स्क्रिप्ट जोड़ना नहीं है?

संपादित करें: मुझे अभी पता चला है कि SQL सर्वर के वेब संस्करण में, जो मैं चला रहा हूं, DTS आपको पैकेजों को सहेजने नहीं देगा।

जवाबों:


28

मुझे यह समाधान SQLTeam.com पर दिया गया था:

उपयोग:

 EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

फिर अपना डेटा आयात करें

EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

उस पद्धति का उपयोग करके मैं बिना किसी समस्या के सभी डेटा को आयात करने में सक्षम था।


1
sp_msforeachtable(और sp_MSForEachDb) अनिर्दिष्ट और असमर्थित है। आपको इसका उपयोग करने से बचना चाहिए। यह तालिकाओं को छोड़ सकता है !! > - @AaronBertrand से यह पोस्ट देखें sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/... और इस कनेक्ट आइटम - (एमएस संकेत नहीं होते कि वे इसे ठीक) -> connect.microsoft.com/SQLServer / प्रतिक्रिया / विवरण / 264677 /…
शाह

एक डेटा निर्यात के लिए FK बाधाओं के आसपास पाने की कोशिश कर रहे मेरे दिमाग की धड़कन के घंटे के बाद मेरे लिए पूरी तरह से काम किया।
लेविनिन्जा

Azure SQL V12 पर चल रहा है, मुझे त्रुटि "संग्रहीत कार्यविधि 'sp_msforeachtable' नहीं मिल सकी।"
दाई

किसी भी तरह से काम नहीं करता है: /
डगलस गस्केल

आप जीवन रक्षक हैं
Bak'r

5

मैंने एक सर्वर से अपनी मशीन पर एक डेटाबेस की एक सटीक प्रतिलिपि बनाई, जिसे मैंने नियंत्रित नहीं किया।

मैं एक schmuck हूँ , लेकिन यह वही है जो मैंने किया था:

  1. स्रोत स्क्रिप्ट (संकेत, संकेत!) में मेरी स्क्रिप्ट से DB बनाया गया था। यदि आपके पास स्क्रिप्ट नहीं है, तो आप Tasksविकल्प के माध्यम से इसे हमेशा मौजूदा DB से उत्पन्न कर सकते हैं ।

  2. यदि कोई भी डेटा आपके निर्माण में YourDB में स्वतः डाला गया था , तो चलाएँ DELETE FROM YourDB.dbo.tblYourTable

    • विदेशी कुंजी मौजूद होने पर आप डेटा को काट नहीं सकते, इसलिए आपको इसका उपयोग करना होगा DELETE
  3. इसे अपने गंतव्य सर्वर पर चलाएँ: USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';

  4. में YourDB पर राइट क्लिक करें Object Explorer। क्लिक करें Tasks->Import Data...

  5. विज़ार्ड के पहले कुछ स्क्रीन आत्म व्याख्यात्मक हैं।

  6. Select Source Table and Viewsविज़ार्ड की स्क्रीन पर , आपके द्वारा कॉपी की गई प्रत्येक तालिका के बगल में स्थित चेकबॉक्स पर क्लिक करें।

  7. उस स्क्रीन पर प्रत्येक पंक्ति (तालिका) के लिए, उस पर क्लिक करें ताकि वह हाइलाइट हो और फिर क्लिक करें Edit Mappings

  8. प्रत्येक पंक्ति (तालिका) के लिए, क्लिक करें / जाँच करें Append rows to the destination tableऔर Enable identity insert

    • यदि आप क्लिक करते हैं Delete rows in destination tableतो यह विफल हो जाएगा क्योंकि यह एक DELETEकमांड जारी नहीं करता है , यह एक कमांड जारी करता है TRUNCATEजो अभी भी हमारी विदेशी कुंजी के साथ संघर्ष करता है क्योंकि पहले से TRUNCATEनियंत्रित नहीं है NOCHECK CONSTRAINT
  9. बाकी विज़ार्ड के माध्यम से क्लिक करें और क्लिक करें Finish

  10. त्रुटियों के लिए देखें ; चेतावनियों को नजरअंदाज करना शायद ठीक है।

    • यदि त्रुटियां हैं, तो Reportबटन पर क्लिक करें और रिपोर्ट देखें। कोशिश करो और बाहर suss क्या था एक Success, Error, और Stopped। आपको शायद उस रिपोर्ट में दबी हुई त्रुटि का मूल कारण जो था उसे ठीक करने की आवश्यकता होगी। फिर, आपको संभवतः ए करने की आवश्यकता होगी DELETE FROM YourDB.dbo.theErrorTable। अब इंपोर्ट विजार्ड पर बैक बटन पर क्लिक करें और हर टेबल को अनचेक करें जो a था Success। दोहराएँ विज्ञापन infinitum।
  11. इसे अपने गंतव्य सर्वर पर चलाएँ: USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';

    • यदि त्रुटियां हैं, तो ... मुझे नहीं पता, लेकिन उन्हें ठीक करें और फिर से प्रयास करें!
  12. वाह! :)

इस सवाल का जवाब देने वाले सभी लोगों के लिए धन्यवाद और एसई नेटवर्क पर इस तरह के सवालों के जवाब देने से मुझे यह पता लगाने में मदद मिली।


आप एक जीवन रक्षक हैं
टॉम गुलेन

1
गंभीरता से आपको बहुत धन्यवाद, एक भ्रष्ट ड्राइव पर बैकअप था, DB को कहीं भी कॉपी नहीं कर सकता था (i / o त्रुटि)। इस समय डेटा को कुछ तालिकाओं में आयात करने से मुझे इसका 99% पुनर्प्राप्त करने में मदद मिली।
टॉम गुलेन

1
आपने धमाल मचाया! एक और कमांड जिसने मेरी मदद की: EXEC sp_msforeachtable 'से हटाएं? '; यदि कोई त्रुटि होती है तो सब कुछ हटा देना कानून है। sp_msforeachtable स्क्रिप्ट यहाँ है gist.githubusercontent.com/metaskills/893599/raw/…
Sanchitos

4

आयात विज़ार्ड में, आप पहले पंक्तियों को हटा सकते हैं और यदि आपके पास पहचान फ़ील्ड हैं, तो आप नीचे के रूप में पहचान सम्मिलित सक्षम कर सकते हैं

यहाँ छवि विवरण दर्ज करें

यदि आप चेक बाधा को अक्षम करना चाहते हैं, तो जब विज़ार्ड आपको पैकेज को बचाने के लिए कहता है, तो इसे सहेजें और फिर नीचे दिए गए कनेक्शन प्रबंधक को संपादित करें:

यहाँ छवि विवरण दर्ज करें

नोट: जब आप विदेशी कुंजी परिभाषित कर रहे हैं, तो आप तालिका को TRUNCATE नहीं कर सकते।


3

बाधाओं को मत छोड़ो।

आपको जो कुछ करना चाहिए वह SSIS पैकेज को बनाता है जो विज़ार्ड बनाता है, फिर उसे BIDS / SSDT में संपादित करें। जब आप उस पैकेज को संपादित करते हैं तो आप उस आदेश को नियंत्रित कर पाएंगे जो तालिकाओं में संसाधित होता है, इसलिए आप माता-पिता की तालिकाओं को संसाधित कर सकते हैं, उसके बाद बच्चे की तालिकाओं को संसाधित कर सकते हैं जब सभी माता-पिता तालिकाओं को पूरा करते हैं।


3
यह वास्तव में बहुत अजीब नहीं है, यह सुनिश्चित करने के लिए पैकेज को संशोधित करने के लिए अभी लगभग एक घंटे का समय लगेगा, यह सुनिश्चित करने के लिए कि सब कुछ सही क्रम में है, और फिर भी मुझे यकीन नहीं हो रहा है। यह अधिक बोझिल हो जाएगा क्योंकि DB बढ़ता है और इसे हर बार करने के लिए, कोई धन्यवाद नहीं। ऐसा करने का एक सरल तरीका होना चाहिए।

1

इस तरह की समस्याएं हमें दिखाती हैं कि जो लोग SQL सर्वर बनाते हैं, उन्होंने वास्तव में अपने उत्पाद का उपयोग नहीं किया है। यह इतनी शानदार चूक है कि किसी को आश्चर्य होता है कि उन्हें और क्या करना है जो सही तरीके से भूल गए हैं (मुझे इस तरह के लगभग 30 अन्य मुद्दों की सूची मिली है जो मुझे इस काम को करने के लिए दूर करना होगा क्योंकि अन्य डीबी बाहर करते हैं बॉक्स सहित, इस तथ्य सहित कि हमें पहली जगह में ऐसा करने के लिए एक घटिया विज़ार्ड की आवश्यकता है [अगर मेरे पास समय है तो मैंने इस विज़ार्ड को उसी डीबी के लिए एक ही टेबल को जोड़ने और संलग्न करने के लिए प्रतीक्षा की है, हर बार, वापस ... मैं एक अच्छा छुट्टी के लिए समय होगा])।

मैं बहुत आलसी हूँ और टाइप नहीं करना चाहता EXEC sp_msforeachtable ...हर बार मैं ऐसा करता हूं। आसपास मेरा काम उत्पादन सर्वर पर बाधाओं को छोड़ने और उन्हें देव सर्वर से हटाने का रहा है। यह त्रुटि को रोकेगा लेकिन इस विधि के कुछ बहुत बड़े दुष्प्रभाव हैं। सबसे पहले, आप अब केवल अपने देव सर्वर पर एक पूर्ण बैकअप बहाल करने में सक्षम नहीं होंगे (जब तक कि आप उन सभी को फिर से हटाने के साथ ठीक नहीं होते)। दूसरा, यह सबसे अच्छा काम करता है जब आप सुनिश्चित होते हैं कि आपके डेटा के उपभोक्ता भी इन बाधाओं को लागू करते हैं (या उनके बारे में परवाह नहीं करते हैं)। मेरे मामले में, हमारे पास केवल एक उपभोक्ता (हमारी वेबसाइट) है, इसलिए हमने इन बाधाओं को साइट कोड में भी बनाया है (यानी उपयोगकर्ता रिकॉर्ड हटाने से पहले हम उस उपयोगकर्ता के लिए सभी फ़ोन रिकॉर्ड हटाते हैं)। हाँ, यह अनिवार्य रूप से पहली जगह में बाधाओं की आवश्यकता की उपेक्षा करता है और उस काम को दोगुना करता है जो मुझे करने की आवश्यकता है लेकिन यह मुझे यह सत्यापित करने का भी मौका देता है कि मेरा कोड DBMS आधारित बाधाओं के साथ या इसके बिना काम करता है (तथ्य यह है कि वे अभी भी ठेस पर हैं सर्वर केवल एक आकस्मिक योजना के रूप में)। आप इसे मेरे डिज़ाइन में एक दोष कह सकते हैं, लेकिन मैं इसे दोषपूर्ण DBMS के लिए समाधान कहूंगा। किसी भी दर पर, यह MSSQL के भीतर कहीं और से ऐसा करना अभी भी तेज और आसान है क्योंकि यह अपने स्वयं के डिजाइन के साथ सामना करने में असमर्थ है।


0

मुझे लगता है कि आप बैकअप नहीं कर सकते और उत्पादन सर्वर से पुनर्स्थापित कर सकते हैं क्योंकि यह एक महत्वपूर्ण डेटा है। अच्छी तरह से उचित अधिकारों के बिना यह वास्तव में अधिक जटिल हो जाता है। लेकिन अगर आपके पास db बैकअप n रिस्टोर सही है तो आप इसे परफॉर्म कर सकते हैं।

या फिर, एक तरीका जो मैं सुझाऊँगा, हालाँकि आपके सभी अवरोधों और अनुक्रमित को छोड़ना है और डेटा आयात होने या निर्यात होने के बाद फिर से उन्हें जोड़ना होगा।

सटीक उत्तर नहीं है लेकिन यह तेजी से प्रक्रिया करेगा।


धन्यवाद, लेकिन मैंने विशिष्ट रूप से कहा कि मैं एक ड्रॉप स्क्रिप्ट बनाना / बाधा स्क्रिप्ट बनाना नहीं चाहता।

0

बस उस विषय को पढ़ें। यह एक पुरानी पोस्ट है लेकिन यहाँ मैंने भविष्य के लोगों को इसे पढ़ने में मदद करने के लिए किया है।

मेरे मामले में मैं एक खाली समान तालिका में आयात करना चाहता था। मैपिंग संपादित करते समय, मैं <ignore>प्राथमिक कुंजी के लिए चयन करता हूं । मेरी सारी सामग्री स्वतः अच्छी तरह से जोड़ी जा रही है।

आशा है कि यह किसी की मदद करता है


1
प्राथमिक कुंजी को अनदेखा करें विदेशी कुंजी के साथ मदद मिलेगी?
dezso

मेरे मामले में हाँ, क्योंकि मैं वास्तव में एक तालिका की नकल कर रहा था। इसलिए मैं उसी प्राथमिक कुंजी के साथ समाप्त हुआ। तो मेरी मेज की ओर इशारा करने वाली विदेशी चाबियां अभी भी सही प्रविष्टि के अनुरूप हैं
ग्रेग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.