5

Non ho mai usato Liquibase in precedenza e non riesco a capire come risolvere questo problema. Il progetto a cui ho aderito di recente è un remake di un vecchio progetto, quindi dobbiamo attenerci a un vecchio database, che ha uno schema orribilmente progettato. Il database non usa vincoli di chiave esterna, quindi ci sono ancora voci che puntano a una voce che non esiste più. Nel mio caso si tratta di un medico con un conto bancario presso una banca che non esiste nel database. Il modo in cui il mio team ha gestito questi problemi finora è stato annullando l'ID con NULL. Quindi in pratica quello che sto cercando di fare è impostare tutti gli ID dei conti bancari su NULL, quando la banca è inesistente. Il codice SQL ho fatto per eseguire questa operazione è la seguente:Aggiornamento delle righe in Liquibase con una dichiarazione WHERE complessa

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

mi è stato detto da integrare che fissano nei nostri gruppi di modifiche Liquibase, ma io proprio non riesco a capire come farlo. Questo è quello che ho fatto finora:

<?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> 

L'aggiornamento Liquibase eseguito senza errori, ma quando guardo il database dopo, nulla è cambiato. Qualcuno ha qualche indicazione su come risolvere questo problema?

+0

Oh, e dal modo in cui si utilizza un database Oracle 10g se questo aiuta. – David

risposta

7

Alla fine ho capito qual era il problema. In realtà non c'era alcun problema con il changeset stesso. Quando Liquibase aggiorna il database, registra tutti i changeset nel database, in modo che i changeset che sono già stati eseguiti non vengano eseguiti di nuovo. Liquibase salva un hash del contenuto del changeset, in modo che i changeset che sono stati modificati vengano nuovamente eseguiti. Il vero problema era che il database era pulito quando ho eseguito il changeset per la prima volta, perché l'ho fatto manualmente usando il seguente comando SQL: UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);. Successivamente ho modificato una riga di dottore e ho impostato l'ID banca su una banca che non esiste ed ho eseguito di nuovo il changeset, solo per verificare se il changeset funziona effettivamente. Dal momento che Liquibase aveva il mio changeset nel suo log, non è stato eseguito di nuovo. Pertanto non ho potuto vedere il cambiamento nel database. L'ho notato quando ho eseguito il rollback di tutte le modifiche e aggiornato di nuovo il database.

Per completare il gruppo di modifiche, ho anche dovuto definire un rollback, poiché Liquibase non è in grado di ripristinare automaticamente gli aggiornamenti delle righe. Dal momento che gli ID dei conti bancari sono perse per sempre, ho solo aggiunto un comando di nuovo rotolo vuoto:

<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> 
Problemi correlati