मैंने निम्नलिखित कार्यप्रणाली का सफलतापूर्वक उपयोग किया है, जो संस्करण नियंत्रण और आपके डेटाबेस में विस्तृत है :
- मेटाडेटा में संस्करण संख्या बनाए रखना (मैं एक डेटाबेस विस्तारित संपत्ति का उपयोग करता हूं)
- किसी भी स्कीमा परिवर्तन को एक स्क्रिप्ट के रूप में कोडित किया जाता है जो वर्तमान संस्करण से अगले संस्करण तक अपडेट होता है
- सभी लिपियों के साथ संस्करण 0 (प्रारंभिक तैनाती) से वर्तमान संस्करण के लिए सभी तरह के लिए आवेदन जहाजों
- हर बदलाव एक स्क्रिप्ट के जरिए होता है। जिसमें डिक्शनरी और लुकअप टेबल प्रविष्टियों की तरह 'सिस्टम' डेटा परिवर्तन शामिल हैं।
- जब लागू किया जाता है, तो एप्लिकेशन ऑन-डिस्क स्कीमा संस्करण की जांच करता है, फिर स्कीमा को वर्तमान आवश्यक संस्करण में लाने के लिए सभी अपग्रेड चरणों को चलाता है।
मैं अक्सर 'कैसे स्रोत नियंत्रण के तहत वस्तु परिभाषा स्क्रिप्ट रखने से अलग है?' की राय सुनते हैं। अंतर बहुत बड़ा है, क्योंकि जब आप अपने ऐप के नए संस्करण को तैनात करते हैं तो आप बस एक नया डेटाबेस नहीं बनाते हैं। अधिकांश बार आपके ऐप को मौजूदा डेटा सहित मौजूदा डेटाबेस को अपग्रेड करना होगा । यह एक महत्वपूर्ण अंतर है, अपग्रेड के दौरान मौजूदा डेटा की अखंडता और स्थिरता सुनिश्चित करने के लिए आपके अपग्रेड चरणों की आवश्यकता होती है। कुछ ऑपरेशन कोड में तुच्छ होते हैं (तालिका ऑब्जेक्ट डेफिनिशन स्क्रिप्ट के लिए डिफ़ॉल्ट मान के साथ एक गैर-अशक्त स्तंभ जोड़ें), लेकिन वे वास्तव में वास्तविक तैनाती पर बेहद दर्दनाक हैं (तालिका में 1.5 बिलियन पंक्तियाँ हैं, ऐड कॉलम बाहर चला जाएगा लॉग का स्थान अगर 'सिंपल' तरीके से किया जाता है)।
यह ब्रांचिंग के साथ कैसे काम करता है:
- जब शाखा बनाई जाती है, तो यह वर्तमान स्कीमा संस्करण को स्नैप करता है, संस्करण 1.6 कहता है
- जैसे ही टीम शाखा पर काम करना शुरू करती है, यह एक नया संस्करण, 1.7 जोड़ता है, और फिर यह 1.6 से 1.7 तक उन्नयन कदम को कोड करना शुरू कर देता है
- उन्नयन कदम के रूप में बदल जाता है के रूप में शाखा में संशोधन किया जाता है। यह हमेशा स्क्रिप्ट चलाता है जो v 1.6 से 1.7 में अपग्रेड करता है, लेकिन वास्तव में वे स्क्रिप्ट क्या करते हैं, शाखा में सामान्य कोड पुनरावृत्तियों और चेक-इन के अधीन है।
- शाखा विकास को पूरा करती है, यह रिवर्स इंटीग्रेशन (बेसलाइन में वापस मर्ज होने के लिए) तैयार करती है
- यह आधार रेखा से शाखा तक एक नया अग्रगामी एकीकरण करता है। यदि एकीकरण स्कीमा संस्करण में कोई परिवर्तन नहीं लाता है, तो सभी चीजें अच्छी होती हैं, शाखा एकीकृत के रूप में रिवर्स कर सकती है। संस्करण 1.7 नया बेसलाइन संस्करण बन जाता है।
- दिलचस्प बात यह है कि इस बीच एक अन्य शाखा ने आधार को एकीकृत कर दिया है और अब आधार स्कीमा संस्करण 1.7 में बदल गया है। इस मामले में हमारी शाखा को 1.8 से तैनाती लक्ष्य स्कीमा संस्करण को टक्कर देना है और नवीनीकरण के चरण की समीक्षा करना है जो पूर्व में 1.6 से 1.7 तक था यह देखने के लिए कि यह नए वातावरण में कैसे संचालित होता है, 1.7 से 1.8 तक उन्नयन। तार्किक स्कीमा संघर्षों को हल करना होगा, स्क्रिप्ट में बदलाव की आवश्यकता हो सकती है, परीक्षण करना होगा। एक बार पूरा हो जाने पर, शाखा आधार में एकीकृत हो सकती है। उत्पाद का नियोजित लक्ष्य संस्करण अब 1.8 हो गया है।
- जब स्कीमा संस्करण 1.6 में कांटे की दूसरी शाखा रिवर्स-इंटीग्रेट करना चाहती है, तो उसे स्कीमा संस्करण 1.9 पर टक्कर देनी होगी, अपग्रेड स्क्रिप्ट का 1.8 से 1.9 परीक्षण करना होगा, फिर इसे वापस आधार में एकीकृत कर सकते हैं।
ध्यान दें कि इसमें कोई उपकरण शामिल नहीं है, कोई जादू स्कीमा अलग स्क्रिप्टिंग नहीं, कोई जादूगरों और कोई राइट-बटन-क्लिक-जनरेट-स्क्रिप्ट शामिल नहीं है। यह एक 100% डेवलपर संचालित प्रक्रिया है, जो स्रोत (स्क्रिप्ट) पर आधारित है। कई इस पूरी प्रक्रिया को विस्तृत पाते हैं, लेकिन यह काम करता है। वास्तव में, SQL सर्वर उपयोगकर्ता के रूप में, आप पहले से ही SQL सर्वर के अपने दैनिक उपयोग में इस प्रक्रिया के परिणामों का लाभ उठा चुके हैं: SQL सर्वर स्वयं एक बहुत ही समान डेटाबेस अपग्रेड प्रक्रिया का उपयोग करता है और, जैसा कि आप शायद उम्मीद करते हैं, उत्पाद विकास प्रक्रिया व्यापक उपयोग करती है ब्रांचिंग और आपके द्वारा बताई गई समस्या एक बहुत ही वास्तविक समस्या है जिसे हल करना होगा।
BTW, कैसे ब्रांचिंग / एकीकरण वास्तव में स्रोत नियंत्रण उत्पादों के बीच भिन्न होता है, मैं ऑपरेशन के एकीकृत एकीकृत मोड से परिचित शब्दों का उपयोग कर रहा हूं ।