13

मैं अपने डेटाबेस के लिए परिवर्तन स्क्रिप्ट की पीढ़ी को स्वचालित करने का एक तरीका ढूंढ रहा हूं।डेटाबेस परिवर्तन स्क्रिप्ट की स्वचालित पीढ़ी

वर्तमान में हम विजुअल स्टूडियो 2008 डेटाबेस संस्करण का उपयोग करते हैं, जिसमें स्कीमा तुलना विकल्प है, लेकिन मुझे उन कार्रवाइयों को स्वचालित करने का कोई तरीका नहीं दिख रहा है।

मैं अपने दैनिक निर्माण के दौरान एक पुराना और नया डेटाबेस बनाना चाहता हूं और स्कीमा की तुलना उन दोनों के बीच अंतर के लिए एक परिवर्तन स्क्रिप्ट उत्पन्न करती है। (स्कीमा और प्रक्रियाओं में अंतर, लुकअप टेबल को हटाया जा सकता है और समस्याओं के बिना पुनर्निर्मित किया जा सकता है)

क्या किसी को भी समाधान के बारे में पता है, या मैं इसे जाने के लिए स्क्रिप्ट के मील लिखने जा रहा हूं?

किसी भी भुगतान किया उत्पादों का उपयोग करने के अलावा माइक्रोसॉफ्ट टूलींग यहाँ एक विकल्प नहीं है ...

अद्यतन प्रतिक्रिया के आधार पर:

  • मैं विभिन्न आकार के विभिन्न डेटाबेस है, लेकिन सभी परिवर्तनों को एक में होगा पहले से मौजूद डेटा के बारे में जागरूक होने पर नियंत्रित तरीके।
  • केवल "आसान" परिवर्तनों को स्वचालित रूप से देखभाल की जानी चाहिए, मैं कॉलम और तालिकाओं (बहुत आम) के अतिरिक्त सोच रहा हूं। कॉलम हटा दिया हो सकता है कभी नहीं जा (इसलिए यदि ऐसा होता है उपकरण/लिपि के विरोध में हो सकता है)

उत्तर

7

क्या @Anton Gogolev कर रहा है की तरह, हम एक उपकरण है कि आप एक्सएमएल फाइल में माइग्रेशन लिखने की अनुमति देता का उपयोग कर रहे हैं। उपकरण उपयोग हम Liquibase कहा जाता है और यह कई अलग अलग डीबीएमएस जायके का समर्थन करता है। न केवल हम आंतरिक रूप से हमारे डेवलपर स्कीमा पर इसका इस्तेमाल करते हैं, हम भी इसे बाहर से उन्नयन स्थापना है कि ग्राहक चलाता दौरान का उपयोग करें।

+0

अच्छी कॉल, मैं इसे देख लूंगा – thijs

1

आप अपने दृष्टिकोण थोड़ा पीछे की कोशिश कर सकते हैं।

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

+0

हम पहले से ही हमारे डेटाबेस को मॉडल करने के लिए एंटरप्राइज़ आर्किटेक्ट का उपयोग करते हैं, वहां से हम एसक्यूएल स्क्रिप्ट बनाते हैं। मैं यहां क्या देख सकता हूं कि ईए क्या कर सकता है ... – thijs

1

एसक्यूएल तुलना की कार्यक्षमता पुस्तकालयों के रूप में भी उपलब्ध है, और इस तरह के दस्तावेज। मैंने कंसोल ऐप में उन डीएलएस का उपयोग किया, इसमें कोई समस्या नहीं थी।

+0

क्या आप अधिक असेंबली/कक्षाओं के बारे में अधिक विशिष्ट हो सकते हैं, शायद आप कुछ नमूना भी प्रदान करते हैं? – thijs

1

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

मुझे यकीन है कि इस समस्या के लिए पूरी तरह से सामान्य और स्वचालित समाधान नहीं है।

  • यदि आप कॉलम का नाम बदलते हैं और केवल और केवल स्कीमा की तुलना करते हैं? कॉलम गिरा दिया जाएगा और खाली बनाया जाएगा।

  • यदि आप स्तंभ पूर्ण नाम को नाम, मिडलनाम, सुरनाम में विभाजित करते हैं। स्कीमा की तुलना कैसे इस से निपटनी चाहिए?

निश्चित रूप से यह नमूने जारी रखा जा सकता है।

+0

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

2

माइक्रोसॉफ्ट® विजुअल स्टूडियो टीम सिस्टम 2008 डाटाबेस संस्करण पावर टूल्स में एक एसक्लस्केमा कॉम्पैयर टास्क लगता है। http://www.microsoft.com/downloads/details.aspx?FamilyID=73ba5038-8e37-4c8e-812b-db14ede2c354&displaylang=en

यह डेटाबेस संस्करण के पहले संस्करण पर आधारित है और जीडीआर 2 अपडेटेड रिलीज पर नहीं है।

3

thijs उल्लेख किया है, Database Edition Power Tools SqlSchemaCompareTask जो आप अपने कोड से उपयोग कर सकते हैं एक परिवर्तन स्क्रिप्ट उत्पन्न करने के लिए शामिल हैं: वैकल्पिक रूप से

SqlSchemaCompareTask task = new SqlSchemaCompareTask() 
{ 
    SourceConnectionString = "Data Source=source-db; ...", 
    SourceDatabaseName = "source-database-name", 
    TargetConnectionString = "Data Source=target-db; ...", 
    TargetDatabaseName = "target-database-name", 
    OutputFileName = "changes.sql", 
    OutputPath = @"C:\path\to\output" 
}; 

task.Execute(); 

, आप इसे msbuild.exe के माध्यम से एक निर्माण स्क्रिप्ट का उपयोग कर निष्पादित कर सकते हैं:

<Import 
    Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\TeamData\ 
      Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks.targets"/> 
<Target Name ="SchemaCompare"> 
    <SqlSchemaCompareTask 
     SourceConnectionString="$(SourceConnectionString)" 
     SourceDatabaseName="$(TargetDatabase)" 
     TargetConnectionString="$(TargetConnectionString)" 
     TargetDatabaseName="$(TargetDatabase)" 
     OutputPath = "$(IntermediateOutputPath)" 
     OutputFileName = "$(TargetDatabase)SchemaCompare.sql" 
     IgnoreChecks ="true"/> 
</Target> 
+0

यह कार्यक्षमता वीएस -2010 में कहां गई? – CodeGrue

1
10 साल अब मैं DbGhost का उपयोग किया है परामर्शी मैं कम से किया गया है के बहुमत पर एसक्यूएल परिवर्तन प्रबंधन को लागू करने के लिए

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

Innovartis' समर्थन डेटाबेस समर्थन के साथ निरंतर एकीकरण दृष्टिकोण, साथ ही रिलीज प्रक्रिया और अपग्रेड पथ दोनों को कार्यान्वित करने में सहायता प्रदान करने में कोई दूसरा नहीं है। सबसे हाल ही में मैं मोनोरेल/nHibernate परियोजना मैं उस पर काम कर रहा हूँ करने के लिए इसे लागू किया है हमारे POCO डोमेन मॉडल है कि हमारे डेटाबेस निर्दिष्ट करता है से उन्नयन स्क्रिप्ट उत्पन्न करता है। ये प्रत्येक चेक-इन पर हमारे क्रूज़ कंट्रोल बिल्ड का उपयोग करके बनाए और लागू होते हैं।

अधिक विशेष रूप से आपकी स्थिति के लिए, आप DbGhost को अपने डेटाबेस के रिलीज़ संस्करण (v1.0) पर इंगित कर सकते हैं और अपने स्रोत और स्थिर डेटा को स्क्रिप्ट कर सकते हैं। इसे फिर स्रोत नियंत्रण में दर्ज किया जा सकता है। ये वैकल्पिक कदम हैं लेकिन एक बुद्धिमान प्रारंभिक बिंदु हैं।

DbGhost स्रोत या वर्तमान डेटाबेस से उत्पन्न डेटाबेस (v /.1) से उत्पन्न डेटाबेस (और/या बना) की तुलना भी कर सकते हैं (या v1.1 कहें) और या तो एक तुलना रिपोर्ट प्रदान करें, स्क्रिप्ट अपग्रेड करें या लक्ष्य डेटाबेस को अपग्रेड करें।

हम इसे प्रत्येक डेल्टा के बीच उन्नत करने के लिए सभी उन्नयन स्क्रिप्ट (rollforward और रोलबैक) उत्पन्न करने के लिए इस्तेमाल करते हैं।

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

मैं इसके बिना एसक्यूएल सर्वर विकास पर विचार नहीं करता और यह मेरे एसक्यूएल विकास में क्रांतिकारी बदलाव करता।

यदि आपको किसी अनुशंसित प्रक्रिया या अधिक अनुसूचित चरणों पर अधिक जानकारी चाहिए तो कृपया मुझे बताएं।

5

आशा मैं अभी भी मदद कर सकते हैं:

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

मुझे पता है ApexSQL Diff इस कार्यक्षमता का समर्थन करता है और मुझे यकीन है कि रेड गेट से SQL Compare प्रो संस्करण में एक ही विकल्प है।

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