2013-01-23 35 views
14

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

डेटाबेस अपडेट के प्रबंधन में सुधार करने के लिए मैं फ्लाईवे और लिक्विबेस देख रहा हूं। दोनों जो चाहते हैं वह लगभग ऐसा लगता है, (एक तरफ: मैं फिलहाल फ्लाईवे पसंद कर रहा हूं क्योंकि हमारे पास पहले से मौजूद सभी मौजूदा एसक्यूएल/डीडीएल स्क्रिप्ट हैं)। जो मुद्दा मैं देख सकता हूं वह यह है कि वे दोनों डेटाबेस को सीधे अपडेट करते हैं। यह बहुत सारे प्रतिष्ठानों के लिए ठीक है लेकिन सभी नहीं।

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

क्या यह उस मामले के लिए फ्लाईवे या लिक्विबेस या किसी अन्य उपकरण के साथ ऐसा करना संभव है?

+1

liquibase की मेरी पसंदीदा विशेषताओं में से एक यह SQL स्क्रिप्ट उत्पन्न करने की क्षमता है। मैं पागल डीबीए के जो मुझे इनकार एक डेमो के लिए उपयोग कर सकते :-) के साथ इस का उपयोग देखें: http://stackoverflow.com/questions/8397488/comparing-databases-and-genrating-sql-script-using-liquibase/ –

उत्तर

8

लिक्विबेस इसे ठीक से संभालता है। यह वर्तमान स्थिति में आपके डेटाबेस को देखता है, अनुपयोगी परिवर्तनों को पाता है और update कमांड sql output mode में एक SQL स्क्रिप्ट उत्पन्न करता है।

हाइबरनेट जनरेटर के बजाय उचित डेटाबेस माइग्रेशन टूल का उपयोग करना किसी भी मामले में जाने का तरीका है, जितनी जल्दी या बाद में आप एक ऐसी स्थिति के साथ समाप्त हो जाएंगे जो हाइबरनेट समर्थित नहीं है। हमारे लिए यह एक अद्वितीय इंडेक्स छोड़ रहा था और इसे दूसरे के साथ बदल रहा था। डेटाबेस संरचना और इकाई सेम के बीच संगतता के बारे में सुरक्षित महसूस करने के लिए आप hibernate.hbm2ddl.auto=validate को भी सक्षम कर सकते हैं।

+0

इसके लिए धन्यवाद। दस्तावेज़ आउटपुट सुविधा दस्तावेज़ में काफी स्पष्ट है - यह सुनिश्चित नहीं है कि मुझे इसे क्यों याद आया। – pauli

+1

तरल पदार्थ-हाइबरनेट एक्सटेंशन का उपयोग करके, आप बदले गए हाइबरनेट इकाइयों से सीधे परिवर्तन उत्पन्न कर सकते हैं। –

5

क्या आप चाहते हैं एक स्कीमा diff उपकरण है। मुझे याद है कि TOAD के बजाय एक शक्तिशाली है। हाइबरनेट भी उन इकाइयों और डेटाबेस मेटाडेटा के आधार पर स्कीमा अपडेट स्क्रिप्ट उत्पन्न करने का प्रयास करेगा।

हालांकि आपको क्या चाहिए ... ऐसा करने के लिए और इसके बजाय अपने सभी डेटाबेस परिवर्तन करने के लिए फ्लाईवे का उपयोग करें। यही है कि आपको स्वचालित स्कीमा अपडेटों को हाइबरनेट्स करना चाहिए और स्वयं को आगे बढ़ने वाले स्कीमा अपडेट लिखना चाहिए। हर बार जब आप डेटाबेस में बदलाव करना चाहते हैं तो आपको स्कीमा अपडेट लिखना होगा।

कुछ लोग स्वचालित स्कीमा विकास अद्यतन प्राप्त करने के तरीके के रूप में स्कीमा अद्यतन को हाइबरनेट करने के SQL आउटपुट को कैप्चर करते हैं। समस्या यह है कि हाइबरनेट आमतौर पर गलत होता है, खासकर अगर @NotNull कॉलम जोड़ें।

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

+1

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

+1

हां लेकिन मैं देख सकता हूं कि क्यों डीबीए एसक्यूएल देखना चाहता है कि फ्लाईवे इसे चलाने से पहले दौड़ना चाहता है। सिद्धांत रूप में ऐसा लगता है कि आप फ्लाईवे प्रयास को स्कीमा परिवर्तन करने और फिर रोलबैक बनाने या आदेशों को निष्पादित करने के लिए भी नहीं कर सकते ... सही? बीटीडब्ल्यू मुझे फ्लाईवे पसंद है ... इसे बनाने के लिए धन्यवाद। –

2

हां, एक SQL स्क्रिप्ट उत्पन्न करना Liquibase के लिए एक अंतर्निहित सुविधा है। एक अन्य क्षेत्र जहां फ्लाईवेस पर फ्लाईबेस का लाभ है, यह डेटाबेस कोड परिवर्तन (पैकेज, प्रक्रियाओं और कार्यों) को माइग्रेट करने की क्षमता है। मैं फ्लाईवे का उपयोग करता हूं लेकिन मुझे उन लिक्विबेस सुविधाओं को फ्लाईवे में उपलब्ध करना अच्छा लगेगा।

+0

फ्लाईवे डेटाबेस कोड परिवर्तनों का भी समर्थन करता है। – trondd

3

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

हमने इसे फ्लाईवे कोर रेपो में शामिल करने में असफल प्रयास करने की कोशिश की।

https://github.com/Intelliware/flyway-script-generator