Frage

Ich bin mit Phing 's dbdeploy Aufgabe verwalten mein Datenbankschema . Dies funktioniert gut, solange es keine Fehler in den Abfragen meiner Delta-Dateien ist.

Wenn jedoch ein Fehler auftritt, dbdeploy wird nur die Delta-Dateien auszuführen, mit dem Fehler auf die Abfrage und dann abbrechen. Dies verursacht mir einige Frustration, weil ich manuell dann den Eintrag in der Changelog Tabelle Rollback. Wenn ich es nicht tun, wird annehmen dbdeploy die Migration auf einem nachfolgenden Versuch erfolgreich war, so werden alle Wiederholungen nichts tun.

Die Frage ist also, gibt es eine Möglichkeit dbdeploy Verwendung Transaktionen zu erhalten oder können Sie eine andere Art und Weise vorschlagen Rollbacks automatisch haben phing wenn ein Fehler auftritt

Hinweis: Ich bin nicht so bewandert mit Phing, so wenn es sich um eine benutzerdefinierte Aufgabe zu schreiben, jeder Beispiel-Code oder eine URL mit weiteren Informationen wird sehr geschätzt. Dank

War es hilfreich?

Lösung

(wenn Sie noch da draußen sind ...) In Bezug auf phing für eine db-Dump Aufgabe, verwenden Sie den Dump-Dienstprogramm db und eine phing Aufgabe erstellen. Ich benutze Postgres hauptsächlich und haben dies in meinem 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>

Andere Tipps

Der einfachste Weg, um Ihr Problem zu lösen, ist pdoexec Aufgabe zu verwenden, die von Standard-SQL-Skript in der Transaktion ausgeführt wird. Wenn Fehler der Datenbank-Engine auftreten, wird Ihre Änderungen automatisch Rollback (auch Log-Tabelle der auf Veränderung - Datenbank in früherem Zustand sein wird)

Beispiel:

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

Ich weiß, das ist sehr alter Thread, aber vielleicht wird es sonst Gebrauch voll für jemanden sein. Sie können TRY> catch-Anweisungen verwenden, um eine Lösung für die Umsetzung. Mein Beispiel:

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

Warum nicht eine Reihe von Undo-Delta schreiben und eine phing Aufgabe, die läuft bei Ausfall der anderen Aufgabe hinzufügen?

Sie sollten wirklich einen Blick auf Capistrano nehmen. TomTom: Sie vermissen etwas hier: das Backup vor Schemaänderung natürlich gemacht werden muss - was aber mit den neuen Daten zu tun, die inzwischen eingeführt wurde Sie dachten, dass alles in Ordnung ist? Ich sage nicht,, tthat es ein gutes Werkzeug für dieses Problem ist, aber das Problem besteht im wirklichen Leben.

Der „richtige“ Weg, dies zu tun, ist eine Sicherung vor Schemaänderung, dann Rollback im Fehlerfall.

müssen Sie nicht sagen, was db Sie verwenden - aber es würde mich wundern, wenn alle Schemaänderungen in Transaktionen unterstützt werden würde. Mos Oberschenkelende SQL-Datenbanken (Oracle, DB2, SQL Server) nicht, dass für wirklich gute Gründe, in allen Fällen zu tun. Transacitonal Schemaänderungen wirklich hart sind und wirklich resouce intensiv.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top