Domanda

Phing s ' dbdeploy compito per gestire il mio schema di database . Questo sta lavorando bene, a patto che non ci sono errori nelle query dei miei file delta.

Tuttavia, se si verifica un errore, dbdeploy sarà solo eseguire i file delta fino alla query con l'errore e poi abortire. Questo mi provoca una certa frustrazione, perché devo far ritirare manualmente la voce nella tabella changelog poi. Se non lo faccio, dbdeploy assumerà la migrazione ha avuto successo in una prova successiva, in modo da eventuali tentativi non farà nulla.

Quindi la domanda è, non v'è alcun modo per ottenere le operazioni di uso dbdeploy o si può suggerire un altro modo per avere automaticamente rollback Phing in caso di errore

Nota: non sono così competente con Phing, quindi se questo comporta la scrittura di un compito personalizzato, qualsiasi codice di esempio o di un URL con ulteriori informazioni è molto apprezzato. Grazie

È stato utile?

Soluzione

(se siete ancora là fuori ...) Per quanto riguarda Phing per un compito discarica db, utilizzare l'utilità di dump del db e creare un'attività Phing. Io uso principalmente Postgres e avere questo nel mio phing build.xml:

<target name="db-dump" depends="">
    <php expression="date('Ymd-Hi')" returnProperty="phing.dump.ts"/>
    <exec command="pg_dump -h ${db.host} -U ${db.user} -O ${db.name} | gzip > ${db.dumppath}/${db.name}-${phing.dump.ts}.gz" />
</target>

Altri suggerimenti

Il modo più semplice di risolvere il tuo problema è quello di usare compito pdoexec che di default viene eseguito lo script SQL in una transazione. Quando errore si verifica il motore di database verrà rollback automaticamente le modifiche (anche quelli sulla tabella di cambiamento di registro - database sarà in stato precedente)

Esempio:

<pdosqlexec 
    url="pgsql:host=${db.host}
    dbname=${db.name}"
    userid="${db.user}"
    password="${db.pass}"
    src="${build.dbdeploy.deployfile}"
/>

Lo so, questo è molto vecchio thread, ma forse sarà pieno uso per qualcun altro. È possibile utilizzare try-> dichiarazioni di cattura per implementare una soluzione per questo. Il mio esempio:

<trycatch>
    <try>
        <exec
            command="${progs.mysql} -h${db.live.host} -u${db.live.user} -p${db.live.password} ${db.live.name} &lt; ${db.live.output}/${build.dbdeploy.deployfile}"
            dir="${project.basedir}"
            checkreturn="true" />
            <echo>Live  database was upgraded successfully</echo>
    </try>    
    <catch>
            <echo>Errors in upgrading database</echo>
            <exec
            command="${progs.mysql} -h${db.live.host} -u${db.live.user} -p${db.live.password} ${db.live.name} &lt; ${db.live.output}/${build.dbdeploy.undofile}"
            dir="${project.basedir}"
            checkreturn="true" />
    </catch>
    </trycatch>

Perché non scrivere una serie di delta di annullamento e di aggiungere un'attività phing che viene eseguito sul fallimento del altro compito?

si dovrebbe davvero dare un'occhiata a Capistrano. TomTom: vi manca qualcosa qui: il backup prima modifica dello schema, naturalmente, deve essere fatta - ma cosa fare con i dati di nuovo che è stata inserita nel frattempo si stavano pensando che tutto è ok? Non dico, tthat c'è un buon strumento per questo problema, ma il problema esiste nella vita reale.

Il modo "corretto" per farlo è un backup prima di modifica dello schema, quindi rollback in caso di errore.

Tu non dire quello che si usa db - ma sarebbe mi chiedo se tutte le modifiche dello schema sarebbero sostenuti nelle transazioni. Mos database end coscia SQL (Oracle, DB2, SQL Server) non lo fate che in tutti i casi per davvero buone ragioni. modifiche dello schema Transacitonal sono davvero duri e davvero resouce intensiva.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top