5

के साथ Liquibase में पंक्तियों को अद्यतन करना मैंने पहले कभी Liquibase का उपयोग नहीं किया है और बस इस समस्या को हल करने का तरीका नहीं समझ सकता है। जिस परियोजना में मैंने हाल ही में शामिल किया है वह पुरानी परियोजना का रीमेक है, इसलिए हमें पुराने डेटाबेस के साथ रहना होगा, जिसमें एक बेहद डिज़ाइन किया गया स्कीमा है। डेटाबेस कोई विदेशी कुंजी बाधाओं का उपयोग नहीं करता है, इसलिए अभी भी प्रविष्टियां हैं जो एक प्रविष्टि को इंगित करती हैं जो अब मौजूद नहीं है। मेरे मामले में यह एक ऐसे बैंक में बैंक खाता है जिसके पास डेटाबेस में मौजूद नहीं है। जिस तरह से मेरी टीम ने इन समस्याओं को संभाला है, अब तक शून्य के साथ आईडी ओवरराइड कर रहा था। तो मूल रूप से जो मैं करने की कोशिश कर रहा हूं वह है कि सभी बैंक खाता आईडी न्यूल पर सेट करें, जब बैंक अस्तित्व में न हो। एसक्यूएल कोड मैं पूरा करने के लिए इस कार्य इस प्रकार है बनाया:एक जटिल WHERE कथन

UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK); 

मैं एकीकृत करने के लिए है कि हमारे Liquibase changesets में ठीक बताया गया था, लेकिन मैं सिर्फ यह कैसे करना है पता नहीं कर सकते हैं।

<?xml version="1.0" encoding="UTF-8"?> 

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
             http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd"> 
    <changeSet id="remove_fk_bankid" author="v7"> 
     <update tableName="DOCTOR"> 
      <column name="FK_BANKID" value="NULL" /> 
      <where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where> 
     </update> 
    </changeSet> 
</databaseChangeLog> 

Liquibase अद्यतन त्रुटियों के बिना चलाता है, लेकिन जब मैं बाद में डेटाबेस को देखो, कुछ भी नहीं बदला है: यह मैं अब तक क्या किया है है। क्या किसी के पास इस समस्या को हल करने के लिए मेरे लिए कोई संकेतक है?

+0

ओह और जिस तरह से, हम एक Oracle 10g डेटाबेस का उपयोग कर रहे हैं कि अगर मदद करता है। – David

उत्तर

7

मुझे अंत में पता चला कि समस्या क्या थी। वास्तव में बदलाव के साथ वास्तव में कोई समस्या नहीं थी। जब Liquibase डेटाबेस को अद्यतन करता है तो यह डेटाबेस में सभी परिवर्तनों को लॉग करता है, ताकि परिवर्तन जो पहले ही निष्पादित किए गए हैं, फिर से निष्पादित नहीं होंगे। Liquibase परिवर्तन की सामग्री का हैश बचाता है, ताकि परिवर्तनों को बदल दिया गया हो फिर से निष्पादित किया जाएगा। वास्तविक समस्या यह थी कि जब मैंने पहली बार परिवर्तन को निष्पादित किया था तो डेटाबेस साफ़ था, क्योंकि मैंने इसे निम्न SQL कमांड का उपयोग करके मैन्युअल रूप से किया था: UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);। इसके बाद मैंने डॉक्टर की पंक्ति बदल दी और बैंक आईडी को उस बैंक में सेट किया जो अस्तित्व में नहीं है और फिर से बदलाव को निष्पादित कर रहा है, यह जांचने के लिए कि क्या परिवर्तन वास्तव में काम करता है या नहीं। चूंकि लिक्विबेस के लॉग में मेरा परिवर्तन था, इसलिए इसे फिर से निष्पादित नहीं किया गया था। इसलिए मैं डेटाबेस में परिवर्तन नहीं देख सका। मैंने देखा कि जब मैंने सभी परिवर्तनों को वापस ले लिया और डेटाबेस को फिर से अपडेट किया।

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

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
             http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd"> 
    <changeSet id="remove_fk_bankid" author="v7"> 
     <update tableName="DOCTOR"> 
      <column name="FK_BANKID" value="NULL" /> 
      <where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where> 
     </update> 
     <rollback> 
     </rollback> 
    </changeSet> 
</databaseChangeLog> 
संबंधित मुद्दे