2010-09-01 13 views
6

है हम liquibase का उपयोग हमारे डेटाबेस परिवर्तन का ट्रैक रखने के बिना छोड़ बाधा .. पहले ChangeSet उन पंक्तियों में शामिल है बाधा हर बार और आमतौर पर अलग हो सकती है (हम एच 2 डेटाबेस के खिलाफ कुछ एकीकरण परीक्षण चलाते हैं और प्रत्येक बार जब हम परीक्षण चलाते हैं तो नए बेस बनाए जाते हैं)Liquibase जानते हुए भी यह नाम

तो .. समस्या है: मैं इस पहले परिवर्तन को बदल नहीं सकता लेकिन अब हमें इस अनूठी बाधा से छुटकारा पाना है। कोई विचार यह है कि तरल पदार्थ का उपयोग करके इसे कैसे प्राप्त किया जाए?

उत्तर

3

बाधाओं को छोड़ने के लिए एच 2 एसक्यूएल एक बाधा नाम की आवश्यकता है। मुझे याद नहीं है कि एच 2 में ऑटो-जनरेटेड बाधा नाम यादृच्छिक है या डेटाबेस में सुसंगत होगा।

यदि यह स्थिर है, तो आप सामान्य तरल पदार्थ टैग का उपयोग कर सकते हैं और यह ठीक काम करेगा।

यदि यह यादृच्छिक है, तो आपको info_schema से बाधा नाम प्राप्त करना होगा। एच 2 की तरह कुछ अनुमति दे सकता है:

alter table TABLE_NAME drop constraint 
     (select unique_index_name 
       from information_schema.constraints 
       where table_name='TABLE_NAME' and column_name='SHORT_ID') 

यदि नहीं, तो परिवर्तन liquibase एक कस्टम (2.0 के साथ http://liquibase.org/extensions, 1.9 में http://www.liquibase.org/manual/custom_refactoring_class) फोन करेगा और बाधा चला जाता है कि बनाने के लिए आवश्यकता हो सकती है।

+1

पहले इसे आजमाया .. ड्रॉप बाधा कमांड में चयन खंड नहीं हो सकता है :) और बाधाओं के नाम सुसंगत नहीं हैं .. मैंने उन कस्टम रिफैक्टरिंग कक्षाओं से बचने की कोशिश की लेकिन यह वास्तव में केवल विकल्प की तरह लगता है .. इसलिए दृष्टिकोण के लिए धन्यवाद और +1 और यदि कोई कस्टम तरल पदार्थ परिवर्तन के बिना समाधान के साथ आता है तो यह मेरा स्वीकार्य उत्तर होगा ..;] – vrm

+1

मैं एमएस एसक्यूएल सर्वर पर ड्रॉप बाधा कमांड में अनुमत नहीं होने के चयन के साथ एक ही समस्या में भाग गया। मैं तालिका कंटेनर पर एक कॉल माप के लिए एक अद्वितीय बाधा डालने के लिए निम्न कार्य कर रहा हूं https://bowerstudios.com/node/995 (लिंक क्योंकि टिप्पणी बॉक्स में अपर्याप्त वर्ण)। समाधान नेथन का प्रतीक है, लेकिन एमएस एसक्यूएल सर्वर के लिए tweaked है। –

1

HSQL क्वेरी जो नाथन सुझाव काम नहीं करता है के लिए (बदल तालिका TABLE_NAME ड्रॉप बाधा (information_schema.constraints से चयन unique_index_name जहां TABLE_NAME = 'TABLE_NAME' और स्तंभ = 'SHORT_ID'))

यह वह जगह है क्योंकि, डीडीएल और एसक्यूएल को मिश्रित नहीं किया जा सकता है।

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

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

अभी के लिए, मैं सिर्फ कठिन कोड अद्वितीय बाधा नाम (चारों ओर एक काम)

2

Liquibase बाधा नाम जानने के बिना एक नहीं अशक्त बाधा को छोड़ने के लिए एक कार्यान्वयन प्रदान करता है। यह सवाल तब नहीं हो सकता जब यह सवाल पूछा गया (मुझे एहसास हुआ कि यह काफी पुराना है)।

dropNotNullConstraint

<dropNotNullConstraint catalogName="cat" 
      columnDataType="int" 
      columnName="id" 
      schemaName="public" 
      tableName="person"/> 

एक dropUniqueConstraint मौजूद है, लेकिन आप शायद पहले से ही यह बारे में पता था के रूप में यह बाधा नाम की आवश्यकता है।

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