2008-09-12 21 views
5

संपादित करें: मुझे इसे पूरी तरह से दोबारा दोहराएं, क्योंकि मुझे यकीन नहीं है कि एक एक्सएमएल तरीका है जैसा कि मैं मूल रूप से वर्णन कर रहा था।डेटाबेस से डेटाबेस में संबंधपरक डेटा की प्रतिलिपि बनाना

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

डेटाबेस ए में, मेरे पास पीके और एफके से संबंधित टेबल का एक सेट है। बच्चे और पोते की मेज के साथ एक अभिभावक तालिका, मान लें।

मैं डेटाबेस ए से डेटाबेस बी पर पंक्तियों का एक सेट कॉपी करना चाहता हूं, जिसमें समान रूप से टेबल और फ़ील्ड नाम हैं। प्रत्येक तालिका के लिए, मैं डेटाबेस बी में एक ही तालिका में सम्मिलित करना चाहता हूं लेकिन मुझे वही प्राथमिक कुंजी का उपयोग करने के लिए बाध्य नहीं किया जा सकता है। प्रतिलिपि दिनचर्या को डेटाबेस बी में प्रत्येक पंक्ति के लिए नए पीके बनाना होगा, और उन्हें बच्चों की पंक्तियों में प्रचार करना होगा। मैं दूसरे शब्दों में डेटा के बीच समान संबंध रख रहा हूं, लेकिन एक ही सटीक पीके और एफके नहीं।

आप इसे कैसे हल करेंगे? मैं सुझावों के लिए खुला हूं। एसएसआईएस पूरी तरह से इनकार नहीं किया गया है, लेकिन यह मुझे नहीं देखता है जैसे यह सही काम करेगा। मैं LINQ में किसी समाधान के लिए भी खुला हूं, या टाइप किए गए डेटासेट का उपयोग कर रहा हूं, या कुछ एक्सएमएल चीज का उपयोग कर रहा हूं, या बस कुछ भी जो SQL Server 2005 और/या C# (.NET 3.5) में काम करेगा। सबसे अच्छा समाधान एसएसआईएस की आवश्यकता नहीं होगी, और बहुत सारे कोड लिखने की आवश्यकता नहीं होगी। लेकिन मैं स्वीकार करूंगा कि यह "सर्वश्रेष्ठ" समाधान मौजूद नहीं हो सकता है।

(मैं अपने आप को ऊपर इस कार्य को कर नहीं किया, न ही कमी;। यह है कि यह कैसे मुझे दिया गया)

+0

मुझे लगता है कि यह एक बार बंद ऑपरेशन है और प्रतिकृति एक विकल्प नहीं है? – Galwegian

+0

नहीं, इसे दोहराने योग्य होना चाहिए; दीर्घकालिक हम निर्दिष्ट करेंगे कि कौन सी चीजों की प्रतिलिपि बनाना है (उदाहरण के लिए मूल डेटाबेस में पीके द्वारा)। चूंकि हम आदेश की गारंटी नहीं दे सकते हैं, इसलिए पीके को नए डेटाबेस में बिल्कुल वैसा ही नहीं होना चाहिए। यदि यह एक अच्छा समाधान है तो प्रतिकृति प्रश्न से बाहर नहीं है। –

+0

क्या आप गंतव्य डेटाबेस में अन्य फ़ील्ड में मूल पीके आईडी रखते हैं (या आप रख सकते हैं)? –

उत्तर

0

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

डेटासेट डेटा को पदानुक्रमित रूप से लूप करने के लिए उचित रूप से आसान बना देगा और डालने के बाद डेटाबेस से पीके को ताज़ा कर देगा।

0

एक्सएमएल दृष्टिकोण डंप और आयात विज़ार्ड/लघु उद्योगों का उपयोग करें।

+0

यदि संभव हो तो हम डीटीएस/एसएसआईएस से दूर रहना पसंद करेंगे। हम किसी ऐसे चीज़ की तलाश में हैं जो (कोड में उचित रूप से पैक किया गया हो) किसी अंतिम उपयोगकर्ता को किसी सूची से आयात करने के लिए आइटमों का एक सेट चुनकर चलाने के लिए आसान है। –

1

सबसे पहले, मुझे कहना है कि एसएसआईएस आपकी सबसे अच्छी शर्त है। लेकिन, आपके द्वारा पूछे गए प्रश्न का उत्तर देने के लिए ...

मुझे विश्वास नहीं है कि आप चारों ओर नई आईडी बनाने के साथ दूर हो पाएंगे, हालांकि आप कर सकते हैं लेकिन आपको लुकअप के लिए उपयोग करने के लिए मूल आईडी लेने की आवश्यकता होगी ।

सबसे अच्छा आप प्राप्त कर सकते हैं तालिका के लिए एक सम्मिलन कथन है।

declare @xml xml 
set @xml='<People Key="1" FirstName="Bob" LastName="Smith"> 
    <PeopleAddresses PeopleKey="1" AddressesKey="1"> 
    <Addresses Key="1" Street="123 Main" City="St Louis" State="MO" ZIP="12345" /> 
    </PeopleAddresses> 
</People> 
<People Key="2" FirstName="Harry" LastName="Jones"> 
    <PeopleAddresses PeopleKey="2" AddressesKey="2"> 
    <Addresses Key="2" Street="555 E 5th St" City="Chicago" State="IL" ZIP="23456" /> 
    </PeopleAddresses> 
</People> 
<People Key="3" FirstName="Sally" LastName="Smith"> 
    <PeopleAddresses PeopleKey="3" AddressesKey="1"> 
    <Addresses Key="1" Street="123 Main" City="St Louis" State="MO" ZIP="12345" /> 
    </PeopleAddresses> 
</People> 
<People Key="4" FirstName="Sara" LastName="Jones"> 
    <PeopleAddresses PeopleKey="4" AddressesKey="2"> 
    <Addresses Key="2" Street="555 E 5th St" City="Chicago" State="IL" ZIP="23456" /> 
    </PeopleAddresses> 
</People> 
' 

select t.b.value('./@Key', 'int') PeopleKey, 
    t.b.value('./@FirstName', 'nvarchar(50)') FirstName, 
    t.b.value('./@LastName', 'nvarchar(50)') LastName 
from @xml.nodes('//People') t(b) 

select t.b.value('../../@Key', 'int') PeopleKey, 
    t.b.value('./@Street', 'nvarchar(50)') Street, 
    t.b.value('./@City', 'nvarchar(50)') City, 
    t.b.value('./@State', 'char(2)') [State], 
    t.b.value('./@Zip', 'char(5)') Zip 
from 
@xml.nodes('//Addresses') t(b) 

क्या करता है एक्सएमएल से नोड्स लेने के लिए और डेटा को पार्स आउट है: यहाँ SELECT रों करने के लिए अपने एक्सएमएल नमूना से आप डेटा प्राप्त करना कोड का एक उदाहरण है। लोगों से संबंधपरक आईडी प्राप्त करने के लिए हम श्रृंखला को ऊपर जाने के लिए ../../ का उपयोग करते हैं।

0

रेड गेट की एसक्यूएल डेटा तुलना में सबसे आसान तरीका है। आप इसे एक या दो मिनट में वर्णित करने के लिए सेट अप कर सकते हैं।

0

मुझे रेड गेट की एसक्यूएल तुलना और डेटा की तुलना भी पसंद है लेकिन यह बदलती प्राथमिक कुंजी के लिए अपनी आवश्यकताओं को पूरा नहीं करेगा जहां तक ​​मैं कह सकता हूं।

यदि क्रॉस डेटाबेस क्वेरी/लिंक किए गए सर्वर एक विकल्प हैं तो आप एक संग्रहीत प्रक्रिया के साथ ऐसा कर सकते हैं जो डीबी ए में अभिभावक/बच्चे से रिकॉर्ड्स को डीबी बी पर अस्थायी तालिकाओं में कॉपी करता है और फिर नई प्राथमिक कुंजी के लिए कॉलम जोड़ता है अस्थायी बाल तालिका जिसे आप शीर्षलेख डालने के बाद अपडेट करेंगे।

मेरा सवाल यह है कि यदि रिकॉर्ड में एक ही प्राथमिक कुंजी नहीं है तो आप कैसे बताते हैं कि यह एक नया रिकॉर्ड है या नहीं? क्या कोई अन्य उम्मीदवार कुंजी है? यदि ये नई टेबल हैं तो उनके पास समान प्राथमिक कुंजी क्यों नहीं हो सकती है?

0

मैंने संग्रहीत प्रक्रियाओं के एक सेट के साथ एक ही चीज़ बनाई है।

डाटाबेस बी की अपनी प्राथमिक कुंजी होगी, लेकिन डीबगिंग उद्देश्यों के लिए डाटाबेस ए की प्राथमिक कुंजी स्टोर करेंगी। इसका मतलब है कि मेरे पास एक से अधिक डाटाबेस ए हो सकते हैं!

डेटा एक लिंक किए गए सर्वर के माध्यम से कॉपी किया गया है। बहुत तेज़ नहीं; एसएसआईएस तेज है। लेकिन एसएसआईएस शुरुआती लोगों के लिए नहीं है, और कुछ ऐसा कोड करना आसान नहीं है जो बदलते स्रोत तालिकाओं के साथ काम करता है।

और सी # से संग्रहीत प्रक्रिया को कॉल करना आसान है।

0

मैं कड़ी मेहनत करने के लिए इन्सर्ट का उपयोग करके इसे संग्रहीत प्रक्रिया में स्क्रिप्ट करता हूं। आपका कोड तालिका ए से संभवतः पीके ले जाएगा (संभवतः @@ स्कोप_इडेन्टिटी के माध्यम से) - मुझे लगता है कि तालिका ए के लिए पीके पहचान क्षेत्र है?

आप अस्थायी तालिकाओं, कर्सर का उपयोग कर सकते हैं या आप सीएलआर का उपयोग करना पसंद कर सकते हैं - यह इस तरह के ऑपरेशन में खुद को उधार दे सकता है।

मुझे ऐसा टूल खोजने में आश्चर्य होगा जो शेल्फ से इसे पहले से ही कर सकता है) पूर्व निर्धारित कुंजी, या बी) पहचान फ़ील्ड (स्पष्ट रूप से टेबल्स बी & सी उनके पास नहीं है)।

0

क्या आप प्रत्येक बार गंतव्य टेबल साफ़ कर रहे हैं और फिर फिर से शुरू कर रहे हैं? यह उस समाधान के लिए एक बड़ा अंतर करेगा जो आपको लागू करने की आवश्यकता है। यदि आप हर बार एक पूर्ण पुन: आयात कर रहे हैं तो आप निम्न की तरह कुछ कर सकते हैं:

अभिभावक तालिका के लिए पुरानी और नई प्राथमिक कुंजी रिकॉर्ड करने के लिए एक अस्थायी तालिका या तालिका चर बनाएँ।

गंतव्य में मूल तालिका डेटा डालें और OUTPUT क्लॉज का उपयोग नई आईडी को कैप्चर करने के लिए करें और उन्हें पुराने आईडी के साथ temp तालिका में डालें। नोट: आउटपुट क्लॉज का उपयोग करना कुशल है और आपको डालने के लिए प्रत्येक रिकॉर्ड के माध्यम से साइकिल चलाने के बिना थोक में सम्मिलित करने की अनुमति देता है।

बच्चे तालिका डेटा डालें। आवश्यक नई विदेशी कुंजी पुनर्प्राप्त करने के लिए temp तालिका में शामिल हों।

उपरोक्त प्रक्रिया टी-एसक्यूएल स्क्रिप्ट, सी # कोड या एसएसआईएस का उपयोग करके किया जा सकता है। मेरी वरीयता एसएसआईएस के लिए होगी।

+0

नहीं, मैं टेबल में मौजूदा डेटा में जोड़ रहा हूं। –

0

यदि आप हर बार जोड़ रहे हैं तो आपको स्रोत डेटाबेस प्राथमिक कुंजी और गंतव्य डेटाबेस प्राथमिक कुंजी (कम से कम मूल तालिका के लिए) के बीच संबंधों को ट्रैक करने के लिए स्थायी तालिका रखने की आवश्यकता हो सकती है। यदि आपको गंतव्य डेटाबेस से इस प्रकार का डेटा रखने की आवश्यकता है, तो आप एसएसआईएस को किसी प्रकार के लॉगिंग डेटाबेस या यहां तक ​​कि एक फ्लैट फ़ाइल से स्टोर/पुनर्प्राप्त करने के लिए प्राप्त कर सकते हैं।

यदि आप अभिभावक तालिका में फ़ील्ड का संयोजन करते हैं तो आप उपरोक्त परिदृश्य से बच सकते हैं जिसका उपयोग उस रिकॉर्ड को विशिष्ट रूप से पहचानने के लिए किया जा सकता है और इसलिए गंतव्य डेटाबेस में उस रिकॉर्ड के लिए प्राथमिक कुंजी "ढूंढें"।

0

इसी तरह के कार्यों से निपटने पर मैंने नौकरी करने के लिए संग्रहीत प्रक्रियाओं का एक सेट बनाया।

जैसा कि आपने निर्दिष्ट कार्य बहुत कस्टम है, आपको "उपयोग करने के लिए तैयार" समाधान की संभावना नहीं है।

बस आपको देने के लिए कुछ संकेत:

  • डेटाबेस अलग सर्वर पर कर रहे हैं जुड़ा हुआ उपयोग सर्वरों तो आप बस TSQL

के माध्यम से स्रोत और गंतव्य दोनों तालिकाओं तक पहुँच सकते संग्रहीत प्रक्रिया में:

  • कॉपी की जाने वाली मूल वस्तुओं की पहचान करें - आपने कहा कि प्राथमिक कुंजी अलग हैं इसलिए आपको इसके बजाय अद्वितीय बाधाओं का उपयोग करने की आवश्यकता है (यदि टेबल सामान्यीकृत हैं तो आपको उन्हें परिभाषित करने में सक्षम होना चाहिए)
  • पहचान किए गए माता-पिता के आधार पर कॉपी किए जाने वाले बच्चों की वस्तुओं की पहचान करें, यह जांचने के लिए कि उनमें से कुछ पहले ही गंतव्य डीबी में हैं, अद्वितीय बाधाओं का उपयोग फिर से करें
  • निम्नतम स्तर के साथ शुरू करने से अधिक पोता आइटम (अभिभावक-बच्चे के साथ के रूप में ही तर्क)
  • कॉपी डेटा पहचानें (पोते, बच्चों, माता-पिता)

कर्सर आदि, बस दुकान के लिए कोई जरूरत नहीं है अस्थायी तालिका में तत्काल परिणाम (या एक संग्रहित प्रक्रिया में काम कर रहे तालिका चर)

उस दृष्टिकोण ने मेरे लिए बहुत अच्छी तरह से काम किया।

आप मुख्य रूप से मुख्य संग्रहीत प्रक्रिया में पैरामीटर जोड़ सकते हैं ताकि आप या तो सभी नए रिकॉर्ड या केवल निर्दिष्ट किए गए प्रतिलिपि बना सकें।

मुझे बताएं कि क्या यह किसी भी मदद की है।

2

मुझे लगता है कि SQL सर्वर उपयोगिता tablediff.exe हो सकता है कि आप जो खोज रहे हैं।

this thread भी देखें।

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