2010-03-16 11 views
6

Sto utilizzando Phing di dbdeploy task a manage my database schema. Funziona bene, a patto che non ci siano errori nelle query dei miei file delta.Trasferimento dell'attività di dbdeploy di Phing per il rollback automatico sull'errore delta

Tuttavia, se si verifica un errore, dbdeploy eseguirà semplicemente i file delta fino alla query con l'errore e quindi interromperà. Questo mi provoca un po 'di frustrazione, perché devo manualmente effettuare il rollback della voce nella tabella del changelog. In caso contrario, dbdeploy presupporrà che la migrazione abbia avuto esito positivo in una prova successiva, quindi eventuali tentativi non faranno nulla.

Quindi la domanda è, c'è un modo per ottenere transazioni dbdeploy uso o si può suggerire un altro modo di avere rollback di phing automaticamente quando si verifica un errore?

Nota: Non sono così abile con Phing, quindi se ciò comporta la scrittura di un'attività personalizzata, qualsiasi codice di esempio o un URL con ulteriori informazioni è molto apprezzato. Grazie

+0

penso phings dbdeploy al suo stato attuale è inferiore a progetti che si concentrano sui db-versioni solo. Vedere http://stackoverflow.com/questions/3324571/is-there-a-php-equivalent-of-rails-migrations per esempio –

risposta

3

(se sei ancora là fuori ...) Per quanto riguarda il phing per un'attività di db dump, usa l'utilità dump db e crea un'attività di 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> 
-1

Il modo "corretto" per fare ciò è un backup prima della modifica dello schema, quindi il rollback in caso di errore.

Non si dice cosa si usi db, ma mi chiederei se tutte le modifiche dello schema sarebbero supportate nelle transazioni. I database SQL di fine coso (oracle, db2, sql server) non lo fanno in tutti i casi per motivi davvero validi. Le modifiche dello schema transacitonale sono REALMENTE difficili e REALMENTE rendono più intenso.

+0

Grazie. Usando MySQL, sto pensando di usarlo per gestire alcune Views in un Oracle 10g. Qualche idea su come eseguire il backup con Phing? – Gordon

+0

No. Non dovrebbe essere fatto lì. è compito degli amministratori eseguire il backup prima delle modifiche alla configurazione e al software. – TomTom

+4

Umm, questo tipo sconfigge lo scopo degli strumenti di distribuzione automatica come phing, vero? – Gordon

1

Perché non scrivere una serie di delta di annullamento e aggiungere un'attività di phing in esecuzione sull'errore dell'altro compito?

+0

Grazie. Ho annullato i delta. Ma come potrei eseguirli automaticamente? In che modo l'altro compito del phing saprebbe quanto lontano correre? – Gordon

+0

in termini di sapere fino a che punto è possibile impostare una proprietà per il punto di partenza. Per quanto riguarda l'esecuzione automatica, non sono sicuro di poterlo fare automaticamente, ma per quanto riguarda l'impostazione di un'attività che controlla la tabella di controllo delle versioni di db e in base a quella che esegue l'annullamento. Si potrebbe voler dare un'occhiata a xinc che ha notificatori per il successo e l'insuccesso con la possibilità di eseguire una logica di codice basata sul successo o l'insuccesso. –

1

dovresti davvero dare un'occhiata a capistrano. TomTom: ti manca qualcosa qui: il backup prima che sia necessario apportare modifiche allo schema, ma cosa fare con i NUOVI dati che sono stati inseriti mentre pensavi che tutto andasse bene? Non dico che esiste un buon strumento per questo problema, ma il problema esiste nella vita reale.

+0

Grazie per il suggerimento. Mi piacerebbe rimanere nell'ecosistema PHP, se possibile, però. – Gordon

3

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 l'errore si verifica il motore di database verrà rollback automaticamente le modifiche (anche quelli sulla tabella di cambiamento di registro - banca dati sarà in stato precedente)

Esempio:

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

Eccellente! Questo funziona perfettamente. – Clint

+0

Funziona per le istruzioni di modifica DDL? Almeno in MySql non è possibile eseguire il rollback. – Gordon

3

lo so, questo è molto vecchio thread, ma forse sarà pieno per qualcun altro. È possibile utilizzare try-> catch statements 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>