SQL सर्वर डेटाबेस का संस्करण


315

मैं संस्करण नियंत्रण के तहत अपने डेटाबेस प्राप्त करना चाहता हूं। किसी को भी मुझे शुरू करने के लिए किसी भी सलाह या सिफारिश की लेख है?

मैं हमेशा कम से कम कुछ डेटा वहाँ रखना चाहता हूँ (जैसा कि उल्लेख है: उपयोगकर्ता प्रकार और व्यवस्थापक)। मैं भी अक्सर प्रदर्शन माप के लिए उत्पन्न परीक्षण डेटा का एक बड़ा संग्रह चाहता हूँ।


इस श्वेत पत्र पर भी एक नजर; डेटाबेस संस्करण नियंत्रण के लिए निश्चित गाइड www3.dbmaestro.com/-
DBAstep

जवाबों:


179

मार्टिन फाउलर ने मेरा पसंदीदा लेख http://martinfowler.com/articles/evodb.html विषय पर लिखा । मैं वर्जन नियंत्रण में स्कीमा डंप्स को एल्मब के रूप में नहीं रखने का विकल्प चुनता हूं और अन्य लोग सुझाव देते हैं क्योंकि मैं अपने उत्पादन डेटाबेस को अपग्रेड करने का आसान तरीका चाहता हूं।

एक वेब एप्लिकेशन के लिए जहां मेरे पास एक एकल उत्पादन डेटाबेस उदाहरण होगा, मैं दो तकनीकों का उपयोग करता हूं:

डेटाबेस उन्नयन लिपियों

एक अनुक्रम डेटाबेस स्क्रिप्ट को उन्नत करता है जिसमें संस्करण N से N + 1 तक स्कीमा को स्थानांतरित करने के लिए DDL आवश्यक होता है। (ये आपके संस्करण नियंत्रण प्रणाली में जाते हैं।) A _version_history_ तालिका, कुछ इस तरह

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

हर बार एक नई प्रविष्टि मिलती है, जो अपग्रेड स्क्रिप्ट चलती है जो नए संस्करण से मेल खाती है।

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

डेवलपर सैंडबॉक्स सिंक्रनाइज़ेशन

  1. किसी प्रोडक्शन डेटाबेस को बैकअप, सैनिटाइज़ और सिकोड़ने की स्क्रिप्ट। उत्पादन DB में प्रत्येक उन्नयन के बाद इसे चलाएँ।
  2. एक डेवलपर के वर्कस्टेशन पर बैकअप को पुनर्स्थापित करने के लिए एक स्क्रिप्ट (और यदि आवश्यक हो, तो ट्वीक करें)। प्रत्येक डेवलपर उत्पादन डीबी में प्रत्येक उन्नयन के बाद इस स्क्रिप्ट को चलाता है।

एक चेतावनी: मेरा स्वचालित परीक्षण स्कीमा-सही लेकिन खाली डेटाबेस के खिलाफ चलता है, इसलिए यह सलाह आपकी आवश्यकताओं के अनुरूप नहीं होगी।


16
पूर्ण स्कीमा स्क्रिप्ट को नियंत्रित करने वाला संस्करण संदर्भ उद्देश्यों के लिए बहुत उपयोगी है। उदाहरण के लिए, यह देखना असंभव है कि वास्तव में ALTER PROCEDURE स्टेटमेंट को देखकर किसी संग्रहीत प्रक्रिया में क्या बदला गया।
कांस्टेंटिन

12
नई अपग्रेड स्क्रिप्ट चलाने के बाद पूर्ण DB स्कीमा को डंप करना (और संस्करण देना) आपके निर्माण / तैनाती प्रक्रिया में अन्य उपकरणों की जानकारी उपलब्ध कराने का एक अच्छा तरीका है। इसके अलावा, स्क्रिप्ट में पूर्ण स्कीमा होने का मतलब है कि सभी माइग्रेशन चरणों के माध्यम से जाने के बिना एक ताज़ा डेटाबेस को "स्पिन अप" करने में सक्षम होना। यह संचित पिछले संस्करणों के मुकाबले वर्तमान संस्करण को अलग करना संभव बनाता है।
एमएलबीबी

2
कह रहे हैं कि आप स्रोत नियंत्रण में उन्नयन स्क्रिप्ट डालते हैं, अखरोट वहाँ रोलबैक नहीं डालते हैं?
AK

9
मुझे एक पूर्ण बनाएँ और ड्रॉप स्क्रिप्ट बनाए रखने की आदत है, साथ ही साथ मौजूदा स्क्रिप्ट्स को अद्यतन करने के लिए डेल्टा स्क्रिप्ट भी। दोनों संस्करण नियंत्रण में जाते हैं। डेल्टा लिपियों को संशोधन संख्या के अनुसार नाम दिया गया है। इस तरह से अद्यतन स्क्रिप्ट के साथ db पैचिंग को स्वचालित करना आसान है।
nikc.org

1
@ nikc.org का जवाब, स्वचालन के लिए प्लस-पोस्ट हुक।
सिल्वियू-मैरियन

45

रेड गेट की एसक्यूएल उत्पाद न केवल आपको ऑब्जेक्ट-स्तरीय तुलना करने की अनुमति देता है, और इससे परिवर्तन स्क्रिप्ट उत्पन्न करता है, बल्कि यह आपको अपने डेटाबेस ऑब्जेक्ट्स को ऑब्जेक्ट प्रकार द्वारा आयोजित एक फ़ोल्डर पदानुक्रम में निर्यात करने की अनुमति देता है, एक [ऑब्जेक्टनेम] के साथ। इन निर्देशिकाओं में प्रति वस्तु लिपि। ऑब्जेक्ट-प्रकार पदानुक्रम इस तरह है:

\ फ़ंक्शन
\ सुरक्षा
\ सुरक्षा \ भूमिकाएँ
\ सुरक्षा \ योजनाएँ
\ सुरक्षा \ उपयोगकर्ता
\ संग्रहीत कार्यविधियाँ
\ तालिकाएँ

यदि आप परिवर्तन करने के बाद अपनी स्क्रिप्ट्स को उसी रूट डायरेक्टरी में डंप करते हैं, तो आप इसका उपयोग अपने SVN रेपो को अपडेट करने के लिए कर सकते हैं, और प्रत्येक ऑब्जेक्ट का रनिंग इतिहास अलग-अलग रख सकते हैं।


6
हमने अभी एसक्यूएल सोर्स कंट्रोल जारी किया है, जो एसक्यूएस और एसएफएन और टीएफएस के लिए आपके द्वारा वर्णित एसक्यूएल तुलना व्यवहार को एकीकृत करता है। मैंने इस प्रश्न का एक अलग उत्तर जोड़ा है जो अधिक विस्तार से बताता है कि यह क्या करता है। red-gate.com/products/SQL_Source_Control/index.htm
डेविड एटकिंसन

39

यह आसपास के विकास में "कठिन समस्याओं" में से एक है। जहां तक ​​मुझे पता है कि कोई सही समाधान नहीं हैं।

यदि आपको केवल डेटाबेस संरचना को संग्रहीत करने की आवश्यकता है न कि डेटा को आप डेटाबेस को SQL क्वेरी के रूप में निर्यात कर सकते हैं। (एंटरप्राइज़ मैनेजर में: डेटाबेस पर राइट क्लिक करें -> SQL स्क्रिप्ट जनरेट करें। मैं विकल्प टैब पर "प्रति ऑब्जेक्ट एक फ़ाइल बनाएँ" सेट करने की सलाह देता हूं) फिर आप इन टेक्स्ट फ़ाइलों को svn के लिए प्रतिबद्ध कर सकते हैं और svn के भिन्न और लॉगिंग फ़ंक्शन का उपयोग कर सकते हैं।

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

यदि आपको सभी डेटा रखने की आवश्यकता है, तो मैं तुलना करने के लिए डेटाबेस का बैकअप रखने और Redgate ( http://www.red-gate.com/ ) उत्पादों का उपयोग करने की सलाह देता हूं । वे सस्ते नहीं आते हैं, लेकिन वे हर पैसे के लायक हैं।


1
डेटा के बारे में - आप अपने पूरे डीबी (शामिल डेटा) के संस्करणों को बचाने के लिए ऑफ़स्केल डेटाग्रोव का उपयोग कर सकते हैं । बाद में आप इसका उपयोग अपने DB की दो आभासी प्रतियों को देखने के लिए कर सकते हैं, जिनकी तुलना लाल-गेट के उत्पाद से की जा सकती है। यह आपको परीक्षण डेटा उत्पन्न करने की आवश्यकता को भी बचाता है - आप अलग-अलग परीक्षण-मामलों (फिर से, संपूर्ण DB की आभासी प्रतियां) से मिलान करने के लिए DB के संस्करणों को बचा सकते हैं
ताइक्मैन

1
यदि आप "स्क्रिप्ट प्रति ऑब्जेक्ट" विकल्प का उपयोग करते हैं तो डेटाबेस स्क्रिप्ट को चलाने के लिए किस तरह से काम करते हैं?
जेमी किट्सन

@Taichman: DataGrove SQL सर्वर का समर्थन नहीं करता है, और जैसे कि प्रश्न की कोई प्रासंगिकता नहीं है।
नियोलिस्क

38

सबसे पहले, आपको उस संस्करण नियंत्रण प्रणाली को चुनना होगा जो आपके लिए सही है:

  • केंद्रीकृत संस्करण नियंत्रण प्रणाली - एक मानक प्रणाली जहां उपयोगकर्ता फाइलों पर काम करने से पहले / बाद में जांच करते हैं और फाइलों को एक ही केंद्रीय सर्वर में रखा जाता है

  • वितरित संस्करण नियंत्रण प्रणाली - एक प्रणाली जहां रिपॉजिटरी का क्लोन बनाया जा रहा है, और प्रत्येक क्लोन वास्तव में रिपॉजिटरी का पूर्ण बैकअप है, इसलिए यदि कोई सर्वर क्रैश हो जाता है, तो किसी भी क्लोन रिपॉजिटरी का उपयोग इसे पुनर्स्थापित करने के लिए किया जा सकता है जो आपकी आवश्यकताओं के लिए सही सिस्टम चुनने के बाद। , आपको रिपॉजिटरी को सेटअप करने की आवश्यकता होगी जो प्रत्येक संस्करण नियंत्रण प्रणाली का मूल है। यह सब निम्नलिखित लेख में समझाया गया है: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding स्रोत नियंत्रण-मूल बातें /

एक रिपॉजिटरी स्थापित करने के बाद, और एक केंद्रीय संस्करण नियंत्रण प्रणाली के काम करने वाले फ़ोल्डर के मामले में, आप इस लेख को पढ़ सकते हैं । यह दिखाता है कि विकास के माहौल में स्रोत नियंत्रण को कैसे सेटअप किया जाए:

  • MSSCCI प्रदाता के माध्यम से SQL सर्वर प्रबंधन स्टूडियो,

  • विजुअल स्टूडियो और एसक्यूएल सर्वर डेटा टूल्स

  • एक 3 पार्टी उपकरण ApexSQL स्रोत नियंत्रण

24

यहां रेड गेट पर हम एक उपकरण, एसक्यूएल सोर्स कंट्रोल की पेशकश करते हैं , जो आपके डेटाबेस को टीएफएस या एसवीएन रिपॉजिटरी से जोड़ने के लिए एसक्यूएल तुलना तकनीक का उपयोग करता है। यह उपकरण SSMS में एकीकृत हो जाता है और आपको सामान्य रूप से काम करने देता है, सिवाय इसके कि अब आप वस्तुओं को कर सकते हैं।

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

SQL स्रोत नियंत्रण में स्थिर डेटा तालिकाओं को निर्दिष्ट करना संभव है। इन्हें स्रोत नियंत्रण में INSERT विवरणों के रूप में संग्रहीत किया जाता है।

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


दिलचस्प उत्पाद (बाजार में थोड़ा सा अंतर) लेकिन डेल्टास को "क्रिएट ..." के रूप में संग्रहीत किया गया। आप कैसे ब्रांचिंग / मर्ज कर रहे हैं?
अन्नकूट

1
हम ऑब्जेक्ट परिभाषाओं को क्रिएट के रूप में संग्रहीत करते हैं, लेकिन यदि आप 'नवीनतम' प्राप्त करते हैं या, उदाहरण के लिए, सिंक स्क्रिप्ट्स को उत्पन्न करने के लिए SQL तुलना प्रो का उपयोग करें, ये उपयुक्त कमांड में बदल जाते हैं, जैसे ALTER। शाखा या मर्ज करने के लिए, आप अपने स्रोत नियंत्रण प्रणाली का उसी तरह उपयोग करेंगे जैसे आप वर्तमान में करते हैं।
डेविड एटकिंसन

यह उत्तर दो साल पहले पोस्ट किए गए डेन के उत्तर का एक डुप्लिकेट है।
वंडरवर्कर

यह एक अलग जवाब है। SQL तुलना संस्करण नियंत्रण डेटाबेस नहीं करता है, जबकि SQL स्रोत नियंत्रण विशेष रूप से उसके लिए डिज़ाइन किया गया था।
डेविड एटकिंसन

21

आप लिक्विबेस ( http://www.liquibase.org/ ) को देखना चाह सकते हैं । यहां तक ​​कि अगर आप उपकरण का उपयोग नहीं करते हैं, तो यह डेटाबेस परिवर्तन प्रबंधन की अवधारणाओं को संभालता है या बहुत अच्छी तरह से फिर से सक्रिय करता है।


हम लगातार वितरण के लिए एक ही शाखा पर 5 वितरित टीमों में लिकिबेस का उपयोग करते हैं और यह बहुत अच्छा काम कर रहा है। हमारे पास 10+ डेटाबेस एप्लिकेशन कई अलग-अलग वातावरणों में स्थापित हैं। हम इसका उपयोग स्कीमा, इंडेक्सिंग, विभाजन, कोड, लुकअप डेटा, समूहों और समूह अनुमतियों को प्रबंधित करने के लिए करते हैं। हम इसका उपयोग Oracle, Postgresql और MSSQL के लिए करते हैं।
पीटर हेनेल

यदि मैं इंट्रो के आधार पर सही ढंग से समझता हूं, तो आपको SQL के बजाय अपनी वस्तुओं को घोषित करने के लिए कुछ मालिकाना xml भाषा की आवश्यकता है? एक भी पंखा नहीं।
JDPeckham

19

अतिरिक्त सलाह और चेतावनी के साथ RedGate टूल की अनुशंसा करने वाले सभी लोगों के लिए +1।

SqlCompare का एक शालीन रूप से प्रलेखित API भी है: इसलिए आप उदाहरण के लिए, एक कंसोल ऐप लिख सकते हैं, जो आपके स्रोत नियंत्रित स्क्रिप्ट फ़ोल्डर को चेकइन पर CI एकीकरण परीक्षण डेटाबेस के साथ सिंक करता है, ताकि जब कोई व्यक्ति अपने स्क्रिप्ट फ़ोल्डर से स्कीमा में परिवर्तन की जाँच करे। यह स्वचालित रूप से मिलान एप्लिकेशन कोड परिवर्तन के साथ तैनात किया गया है। यह उन डेवलपर्स के साथ अंतर को बंद करने में मदद करता है जो अपने स्थानीय डीबी में एक साझा विकास डीबी (लगभग हम में से आधे, मुझे लगता है :)) में परिवर्तन के बारे में भुलक्कड़ हैं।

एक चेतावनी यह है कि एक स्क्रिप्टेड समाधान के साथ या अन्यथा, RedGate टूल पर्याप्त रूप से चिकनी हैं कि अमूर्त अंतर्निहित SQL वास्तविकताओं के बारे में भूलना आसान है। यदि आप किसी तालिका में सभी स्तंभों का नाम बदलते हैं, तो SqlCompare के पास पुराने स्तंभों को नए स्तंभों पर मैप करने का कोई तरीका नहीं है और तालिका के सभी डेटा को छोड़ देगा। यह चेतावनी उत्पन्न करेगा लेकिन मैंने देखा है कि लोग अतीत पर क्लिक करते हैं। यहाँ एक सामान्य बिंदु है जो बनाने लायक है, मुझे लगता है, कि आप केवल DB संस्करण को स्वचालित कर सकते हैं और अब तक अपग्रेड कर सकते हैं - अमूर्त बहुत ही अस्थिर है।


इसलिए ऐसी प्रणाली होनी चाहिए जो आपके द्वारा परिवर्तित किए जा रहे कॉलमों को ट्रैक करे और पुराने कॉलम नामों से नए कॉलम नामों के मैपिंग को याद रखे।
सिल्वरकोड

यह ध्यान में रखने योग्य है कि डेटाबेस परिवर्तनों के लिए अस्पष्टता है (और इसलिए "डेवलपर इरादे" के एक तत्व की आवश्यकता है), एक माइग्रेशन-आधारित समाधान उपयुक्त समाधान है। Redgate के पास अब ReadyRoll है जो इस संस्करण दृष्टिकोण को संतुष्ट करता है।
डेविड एटकिन्सन

15

हम अपने SQL डेटाबेस को प्रबंधित करने के लिए DBGhost का उपयोग करते हैं । फिर आप अपनी स्क्रिप्ट को अपने संस्करण नियंत्रण में एक नया डेटाबेस बनाने के लिए डालते हैं, और यह या तो एक नया डेटाबेस बनाएगा, या किसी मौजूदा डेटाबेस को संस्करण नियंत्रण में स्कीमा में अपग्रेड करेगा। इस तरह आपको परिवर्तन स्क्रिप्ट बनाने के बारे में चिंता करने की ज़रूरत नहीं है (हालाँकि आप अभी भी ऐसा कर सकते हैं, उदाहरण के लिए यदि आप स्तंभ के डेटा प्रकार को बदलना चाहते हैं और डेटा को कनवर्ट करने की आवश्यकता है)।


मैंने 10 साल के लिए डीबीजीहोस्ट का उपयोग किया है और इसने मुझे कभी निराश नहीं किया। वे जो सहायता प्रदान करते हैं, वह किसी से पीछे नहीं है
penderi

15

वीएस 2010 के साथ, डेटाबेस प्रोजेक्ट का उपयोग करें।

  1. अपने डेटाबेस को स्क्रिप्ट करें
  2. स्क्रिप्ट में या सीधे अपने db सर्वर पर बदलाव करें
  3. डेटा> स्कीमा तुलना का उपयोग करके सिंक करें

एक आदर्श DB संस्करण समाधान बनाता है, और DB के एक हवा को सिंक्रनाइज़ करता है।


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

13

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

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

डेटाबेस मेटाडेटा को संभालने के लिए ऑटोमेटिंग टूल के पास साधन होना चाहिए, जो बताता है कि डेटाबेस किस स्थिति में हैं और किन तालिकाओं में संस्करण नियंत्रणीय डेटा और इतने पर हैं।


12

आप माइग्रेशन समाधान भी देख सकते हैं। ये आपको अपने डेटाबेस स्कीमा को C # कोड में निर्दिष्ट करने की अनुमति देते हैं, और MSBuild का उपयोग करके अपने डेटाबेस संस्करण को ऊपर और नीचे रोल करते हैं।

मैं वर्तमान में DbUp का उपयोग कर रहा हूं , और यह अच्छी तरह से काम कर रहा है।


11

आपने अपने लक्षित वातावरण या बाधाओं के बारे में कोई भी उल्लेख नहीं किया है, इसलिए यह पूरी तरह से लागू नहीं हो सकता है ... लेकिन यदि आप प्रभावी ढंग से एक विकसित DB स्कीमा को ट्रैक करने के लिए रास्ता तलाश रहे हैं और उपयोग करने के विचार के प्रतिकूल नहीं हैं रूबी, ActiveRecord का माइग्रेशन आपकी गली-गली तक सही है।

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

क्योंकि माइग्रेशन ActiveRecord का एक हिस्सा है , वे आमतौर पर पूर्ण-स्टैक रेल एप्लिकेशन में उपयोग पाते हैं; हालाँकि, आप न्यूनतम प्रयास के साथ Rails के ActiveRecord स्वतंत्र का उपयोग कर सकते हैं। रेल के बाहर एआर के माइग्रेशन का उपयोग करने के अधिक विस्तृत उपचार के लिए यहां देखें ।


10

प्रत्येक डेटाबेस स्रोत-कोड नियंत्रण के तहत होना चाहिए। क्या कमी है, सभी डेटाबेस ऑब्जेक्ट्स को स्वचालित रूप से स्क्रिप्ट करने के लिए एक उपकरण है - और "कॉन्फ़िगरेशन डेटा" - फाइल करने के लिए, जिसे तब किसी भी नियंत्रण नियंत्रण प्रणाली में जोड़ा जा सकता है। यदि आप SQL सर्वर का उपयोग कर रहे हैं, तो मेरा समाधान यहाँ है: http://dbsourcetools.codeplex.com/ । मज़े करो। - नाथन


9

यह आसान है।

  1. जब आधार परियोजना तैयार हो जाती है तो आपको पूर्ण डेटाबेस स्क्रिप्ट बनानी होगी। यह स्क्रिप्ट एसवीएन के लिए प्रतिबद्ध है। यह पहला संस्करण है।

  2. उसके बाद सभी डेवलपर्स परिवर्तन स्क्रिप्ट (ALTER ..., नई टेबल, स्प्रोक्स, आदि) बनाते हैं।

  3. जब आपको वर्तमान संस्करण की आवश्यकता होती है तो आपको सभी नए परिवर्तन स्क्रिप्ट निष्पादित करने चाहिए।

  4. जब एप्लिकेशन उत्पादन के लिए जारी किया जाता है तो आप 1 पर वापस जाते हैं (लेकिन फिर यह पाठ्यक्रम का क्रमिक संस्करण होगा)।

Nant आपको उन परिवर्तन स्क्रिप्ट को निष्पादित करने में मदद करेगा। :)

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


2
कुछ वर्षों के बाद मैं कहता हूं: फ़्लुएंटमिग्रेटर (या अपने प्लेटफ़ॉर्म के समान उपकरण) का उपयोग करें।
दरियाल

8

यदि आपके पास एक छोटा डेटाबेस है और आप पूरी चीज को, यह बैच स्क्रिप्ट संस्करण बनाना चाहते हैं मदद कर सकती है। यह एक MSSQL डेटाबेस MDF फाइल को सबवर्सन के लिए अलग करता है, कम्प्रेस करता है और जाँचता है।

यदि आप ज्यादातर अपने स्कीमा को संस्करणित करना चाहते हैं और आपके पास संदर्भ डेटा की थोड़ी मात्रा है, तो आप संभवतः इसे संभालने के लिए सबसोनिक माइग्रेशन का उपयोग कर सकते हैं । वहाँ लाभ यह है कि आप किसी भी विशिष्ट संस्करण में आसानी से ऊपर या नीचे जा सकते हैं।


8

डंप को एक सोर्स कोड कंट्रोल सिस्टम बनाने के लिए जो कि थोड़ा तेज होता है, आप यह देख सकते हैं कि पिछली बार sysobjects में संस्करण जानकारी का उपयोग करके कौन सी वस्तुएं बदली हैं।

सेटअप: प्रत्येक डेटाबेस में एक तालिका बनाएं जिसे आप वर्धित रूप से जाँचना चाहते हैं कि पिछली बार आपने जो संस्करण जाँच किया था, उससे संस्करण की जानकारी प्राप्त करने के लिए (पहले रन पर खाली)। यदि आप अपनी संपूर्ण डेटा संरचना को फिर से स्कैन करना चाहते हैं तो इस तालिका को साफ़ करें।

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

सामान्य रनिंग मोड: आप इस sql से परिणाम ले सकते हैं, और उन लोगों के लिए sql स्क्रिप्ट उत्पन्न कर सकते हैं, जिनमें आप रुचि रखते हैं, और उन्हें अपनी पसंद के स्रोत नियंत्रण में रखें।

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

नोट: यदि आप अपने किसी भी डेटाबेस में एक गैर-मानक टकराव का उपयोग करते हैं, तो आपको /* COLLATE */अपने डेटाबेस कोलेशन से बदलना होगा । अर्थातCOLLATE Latin1_General_CI_AI


8

क्योंकि हमारे ऐप को कई आरडीबीएमएस में काम करना पड़ता है, इसलिए हम डेटाबेस-न्यूट्रल टॉर्क फॉर्मेट (एक्सएमएल) का उपयोग करके अपनी स्कीमा परिभाषा को संस्करण नियंत्रण में संग्रहीत करते हैं । हम एक्सएमएल प्रारूप में अपने डेटाबेस के लिए संदर्भ डेटा को संस्करण-नियंत्रण भी करते हैं (जहां "संबंध" संदर्भ तालिकाओं में से एक है):

  <Relationship RelationshipID="1" InternalName="Manager"/>
  <Relationship RelationshipID="2" InternalName="Delegate"/>
  etc.

फिर हम स्कीमा अपग्रेड और रेफरेंस डेटा अपग्रेड स्क्रिप्ट्स को जेनरेट करने के लिए होम-ग्रो टूल्स का उपयोग करते हैं जो कि डेटाबेस के वर्जन X से वर्जन X + 1 तक जाने के लिए जरूरी हैं।


7

हम डेटाबेस स्कीमा को संग्रहीत नहीं करते हैं, हम डेटाबेस में परिवर्तन संग्रहीत करते हैं। हम जो करते हैं वह स्कीमा परिवर्तनों को संग्रहीत करता है ताकि हम डेटाबेस के किसी भी संस्करण के लिए एक परिवर्तन स्क्रिप्ट का निर्माण करें और इसे अपने ग्राहक के डेटाबेस में लागू करें। मैंने एक डेटाबेस यूटिलिटी ऐप लिखा जो हमारे मुख्य एप्लिकेशन के साथ वितरित हो जाता है जो उस स्क्रिप्ट को पढ़ सकता है और यह जान सकता है कि किन अपडेट को लागू करने की आवश्यकता है। इसमें जरूरत के अनुसार विचारों और संचित प्रक्रियाओं को ताज़ा करने के लिए पर्याप्त स्मार्ट भी हैं।


7

X64 प्लेटफ़ॉर्म पर जाने के बाद हमें अपने SQL डेटाबेस को संस्करण की आवश्यकता थी और हमारा पुराना संस्करण प्रवास के साथ टूट गया। हमने एक C # एप्लिकेशन लिखा है जो SQLDMO का उपयोग सभी SQL ऑब्जेक्ट को एक फ़ोल्डर में बाहर करने के लिए करता है:

                जड़
                    सर्वर का नाम
                       डेटाबेस नाम
                          स्कीमा ऑब्जेक्ट
                             डेटाबेस ट्रिगर *
                                .ddltrigger.sql
                             कार्य
                                ..function.sql
                             सुरक्षा
                                भूमिकाएँ
                                   अनुप्रयोग रोल्स
                                      .approle.sql
                                   डेटाबेस रोल्स
                                      .role.sql
                                स्कीमा *
                                   .schema.sql
                                उपयोगकर्ता
                                   .user.sql
                             भंडारण
                                पूर्ण पाठ कैटलॉग *
                                   .fulltext.sql
                             संग्रहित प्रक्रियाएं
                                ..proc.sql
                             समानार्थक शब्द*
                                .synonym.sql
                             टेबल्स
                                ..table.sql
                                प्रतिबन्ध
                                   ... chkconst.sql
                                   ... defconst.sql
                                इंडेक्स
                                   ... index.sql
                                चांबियाँ
                                   ... fkey.sql
                                   ... pkey.sql
                                   ... ukey.sql
                                ट्रिगर
                                   ... trigger.sql
                             प्रकार
                                उपयोगकर्ता-परिभाषित डेटा प्रकार
                                   ..uddt.sql
                                XML स्कीमा संग्रह *
                                   ..xmlschema.sql
                             दृश्य
                                ..view.sql
                                इंडेक्स
                                   ... index.sql
                                ट्रिगर
                                   ... trigger.sql

आवेदन तब एसवीएन में संग्रहीत संस्करण के लिए नए लिखित संस्करण की तुलना करेगा और यदि मतभेद थे तो यह एसवीएन को अपडेट करेगा। हमने निर्धारित किया कि रात में एक बार प्रक्रिया को चलाना पर्याप्त था क्योंकि हम SQL में कई बदलाव नहीं करते हैं। यह हमें उन सभी वस्तुओं में परिवर्तन को ट्रैक करने की अनुमति देता है जिनकी हम देखभाल करते हैं और साथ ही यह हमें एक गंभीर समस्या की स्थिति में हमारे पूर्ण स्कीमा के पुनर्निर्माण की अनुमति देता है।


ऊह, यह सार्वजनिक रूप से उपलब्ध कराने के लिए बहुत अच्छा होगा।
क्रिस चबरुक

7

मैंने थोड़ी देर पहले यह ऐप लिखा था, http://sqlschemasourcectrl.codeplex.com/ जो आपके MSFT SQL db को जितनी बार चाहे उतनी बार स्कैन करेगा और स्वचालित रूप से आपकी वस्तुओं (तालिकाओं, विचारों, procs, फ़ंक्शन, sql सेटिंग्स) को SVN में डंप करेगा। एक जादू की तरह काम करता है। मैं इसका उपयोग अनफ़ुल्ड के साथ करता हूं (जो मुझे चेकइन पर अलर्ट प्राप्त करने की अनुमति देता है)


6

विशिष्ट समाधान डेटाबेस को आवश्यक रूप से डंप करना और उन फ़ाइलों को बैकअप करना है।

आपके विकास मंच के आधार पर, ओपनसोर्स प्लगइन्स उपलब्ध हो सकते हैं। अपने स्वयं के कोड को रोल करना आमतौर पर काफी तुच्छ होता है।

नोट: आप डेटाबेस डंप को संस्करण नियंत्रण में रखने के बजाय बैकअप लेना चाह सकते हैं। संस्करण नियंत्रण में फ़ाइलें बहुत तेज़ हो सकती हैं, और आपके पूरे स्रोत नियंत्रण प्रणाली को धीमा कर सकती हैं (मैं इस समय CVS डरावनी कहानी याद कर रहा हूं)।


6

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

लेकिन, वह मॉडल बहुत बड़े या तीसरे पक्ष के डेटाबेस (वस्तुओं को एन्क्रिप्ट करने) को अच्छी तरह से फिट नहीं करता है। इसलिए, हमने जो किया है वह केवल हमारी अनुकूलित वस्तुओं को संग्रहीत करना है। विजुअल स्टूडियो / टीम फाउंडेशन सर्वर इसके लिए बहुत अच्छा काम करता है।

टीएफएस डेटाबेस मुख्य आर्क। ब्लॉग

एमएस टीएफएस साइट


6

मैं ईएसवी उत्तर के साथ सहमत हूं और उस सटीक कारण के लिए मैंने एक बहुत ही साधारण फ़ाइल में डेटाबेस अपडेट बनाए रखने में मदद करने के लिए थोड़ी देर पहले एक परियोजना शुरू की थी जो तब एक लंबे साइड आउट सोर्स कोड को बनाए रखा जा सकता था। यह डेवलपर्स के साथ-साथ यूएटी और प्रोडक्शन को आसान अपडेट देता है। यह टूल Sql Server और MySql पर काम करता है।

कुछ परियोजना विशेषताएं:

  • स्कीमा बदलने की अनुमति देता है
  • मूल्य पेड़ की आबादी की अनुमति देता है
  • उदाहरण के लिए अलग-अलग परीक्षण डेटा आवेषण की अनुमति देता है। UAT
  • रोलबैक के लिए विकल्प की अनुमति देता है (स्वचालित नहीं)
  • SQL सर्वर और Mysql के लिए समर्थन बनाए रखता है
  • आपके मौजूदा डेटाबेस को एक साधारण कमांड के साथ संस्करण नियंत्रण में आयात करने की क्षमता है (केवल SQL सर्वर ... अभी भी mysql पर काम कर रहा है)

कोड को Google कोड पर होस्ट किया जाता है। कृपया कुछ और जानकारी के लिए Google कोड देखें

http://code.google.com/p/databaseversioncontrol/


5

कुछ समय पहले मुझे एक VB बेस मॉड्यूल मिला, जो DMO और VSS ऑब्जेक्ट्स का उपयोग करके संपूर्ण db को बंद और VSS में लिपिबद्ध करता है। मैंने इसे VB स्क्रिप्ट में बदल दिया और इसे यहाँ पोस्ट किया । आप आसानी से VSS कॉल निकाल सकते हैं और DMO सामान का उपयोग करके सभी स्क्रिप्ट्स बना सकते हैं, और फिर उसी बैच फ़ाइल से SVN को कॉल कर सकते हैं, जो VBScript को कॉल करता है, ताकि उन्हें चेक किया जा सके?

डेव जे


5

मैं डेटाबेस के माध्यम से संग्रहीत डेटाबेस में एक संस्करण का उपयोग कर रहा हूं, प्रक्रियाओं के विस्तारित गुण परिवार। मेरे एप्लिकेशन में प्रत्येक संस्करण चरण के लिए स्क्रिप्ट हैं (अर्थात। 1.1 से 1.2 तक।)। जब परिनियोजित किया जाता है, तो यह वर्तमान संस्करण को देखता है और तब तक स्क्रिप्ट को एक-एक करके चलाता है जब तक कि यह अंतिम ऐप संस्करण तक नहीं पहुंच जाता। ऐसी कोई स्क्रिप्ट नहीं है जिसका सीधा 'अंतिम' संस्करण है, यहां तक ​​कि एक साफ डीबी पर तैनात अपग्रेड चरणों की एक श्रृंखला के माध्यम से तैनाती करता है।

अब मुझे जो कुछ भी पसंद है वह यह है कि मैंने दो दिन पहले एमएस परिसर में नए और आगामी वीएस डीबी संस्करण के बारे में एक प्रस्तुति देखी है। प्रस्तुति विशेष रूप से इस विषय पर केंद्रित थी और मुझे पानी से बाहर निकाला गया था। आपको निश्चित रूप से इसकी जांच करनी चाहिए, नई सुविधाएं टी-एसक्यूएल स्क्रिप्ट्स (क्रीएट्स) में स्कीमा परिभाषा रखने पर केंद्रित हैं, परिभाषित स्कीमा के साथ तैनाती स्कीमा की तुलना करने के लिए एक रनटाइम डेल्टा इंजन और डेल्टा अलर्ट और सोर्सिंग एकीकरण के साथ एकीकरण करने के लिए, अप करने के लिए। और स्वचालित बिल्ड ड्रॉप्स के लिए MSBUILD निरंतर एकीकरण सहित। ड्रॉप में एक नई फ़ाइल प्रकार, .dbschema फ़ाइलें होंगी, जिन्हें परिनियोजन साइट पर ले जाया जा सकता है और एक कमांड लाइन टूल वास्तविक 'डेल्टास' कर सकता है और तैनाती को चला सकता है। इस विषय पर मेरे पास वीएसडीई डाउनलोड के लिंक के साथ एक ब्लॉग प्रविष्टि है, आपको उनकी जांच करनी चाहिए:http://rusanu.com/2009/05/15/version-control-and-your-database/


5

इसका एक बहुत पुराना सवाल है, हालाँकि बहुत से लोग अब भी इसे सुलझाने की कोशिश कर रहे हैं। उन्हें केवल विजुअल स्टूडियो डेटाबेस प्रोजेक्ट्स के बारे में रिसर्च करना है। इसके बिना, कोई भी डेटाबेस डेवलपमेंट बहुत कमज़ोर लगता है। कोड संगठन से तैनाती तक के संस्करण में, यह सब कुछ सरल करता है।


3

मेरे अनुभव में समाधान दो गुना है:

  1. आपको विकास डेटाबेस में परिवर्तन को संभालने की आवश्यकता है जो विकास के दौरान कई डेवलपर्स द्वारा किया जाता है।

  2. आपको ग्राहक साइटों में डेटाबेस अपग्रेड को संभालने की आवश्यकता है।

# 1 को संभालने के लिए आपको एक मजबूत डेटाबेस की आवश्यकता होगी / मर्ज टूल। सबसे अच्छा उपकरण स्वचालित रूप से जितना संभव हो उतना स्वचालित मर्ज करने में सक्षम होना चाहिए, जबकि आप मैन्युअल रूप से अखंडित विवादों को हल करने की अनुमति दें।

एकदम सही उपकरण को 3-वे मर्ज एल्गोरिथ्म का उपयोग करके मर्ज संचालन को संभालना चाहिए जो बीईआरटी डेटाबेस के सापेक्ष THEIRS डेटाबेस और MINE डेटाबेस में किए गए परिवर्तनों को ध्यान में रखता है।

मैंने एक वाणिज्यिक उपकरण लिखा है जो SQLite डेटाबेस के लिए मैनुअल मर्ज समर्थन प्रदान करता है और मैं वर्तमान में SQLite के लिए 3-तरफा मर्ज एल्गोरिथ्म के लिए समर्थन जोड़ रहा हूं। इसे http://www.sqlitecompare.com पर देखें

# 2 को संभालने के लिए आपको जगह में अपग्रेड ढांचे की आवश्यकता होगी।

मूल विचार एक स्वचालित अपग्रेड फ्रेमवर्क विकसित करना है जो जानता है कि मौजूदा SQL स्कीमा से नए SQL स्कीमा में कैसे अपग्रेड किया जाए और हर मौजूदा DB इंस्टॉलेशन के लिए अपग्रेड पथ का निर्माण किया जा सकता है।

इस विषय पर मेरा लेख देखें http://www.codeproject.com/KB/database/sqlite_upgrade.aspx में एक सामान्य विचार प्राप्त करने के लिए कि मैं किस बारे में बात कर रहा हूं।

शुभ लाभ

लिरोन लेवी


3

DBGhost http://www.innovartis.co.uk/ देखें । मैंने 2 साल तक एक स्वचालित फैशन में उपयोग किया है और यह बहुत अच्छा काम करता है। यह हमारे DB को डेटाबेस के अलावा, जावा या C बिल्ड जैसा होता है। आप जानते हैं कि मेरा क्या मतलब है।


2

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

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

काश, यदि आप संस्करण नियंत्रण के तहत भी डेटा रखना चाहते हैं, तो आप डेटाबेस के लिए परिवर्तन स्क्रिप्ट उत्पन्न करने और अपने संस्करण नियंत्रण में .sql फ़ाइलों को जोड़ने के लिए xSQL डेटा तुलना का उपयोग कर सकते हैं। फिर आप इन लिपियों को अपने इच्छित किसी भी संस्करण पर वापस / अपडेट करने के लिए निष्पादित कर सकते हैं। ध्यान रखें कि vert रिवर्ट ’कार्यक्षमता के लिए आपको परिवर्तन स्क्रिप्ट उत्पन्न करने की आवश्यकता है जो निष्पादित होने पर संस्करण 3 को संस्करण 2 के समान ही बना देगा और and अपडेट’ कार्यक्षमता के लिए, आपको विपरीत करने वाली परिवर्तन स्क्रिप्ट उत्पन्न करने की आवश्यकता है।

अंत में, कुछ बुनियादी बैच प्रोग्रामिंग कौशल के साथ आप xSQL स्कीमा की कमांड लाइन संस्करणों का उपयोग करके पूरी प्रक्रिया को स्वचालित कर सकते हैं।

अस्वीकरण: मैं xSQL से संबद्ध हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.