Pergunta

estou usando Phing's Tarefa do DBDeploy para Gerencie meu esquema de banco de dados. Isso está funcionando bem, desde que não haja erros nas consultas dos meus arquivos delta.

No entanto, se houver um erro, o DBDeploy apenas executará os arquivos Delta até a consulta com o erro e, em seguida, abortará. Isso me causa alguma frustração, porque tenho que reverter manualmente a entrada na tabela Changelog. Caso contrário, o DBDeploy assumirá que a migração foi bem -sucedida em uma tentativa subsequente; portanto, qualquer tentativa não fará nada.

Então a questão é, Existe alguma maneira de obter transações de uso do DBDeplo?

Observação: Não sou tão proficiente no Phing; portanto, se isso envolver escrever uma tarefa personalizada, qualquer código de exemplo ou URL com mais informações é muito apreciado. Obrigado

Foi útil?

Solução

(Se você ainda está lá fora ...) Em relação ao Phing para uma tarefa de dump db, use o utilitário de dump do banco de dados e crie uma tarefa de phing. Eu uso o Postgres principalmente e tenho isso no meu 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>

Outras dicas

A maneira mais simples de resolver seu problema é usar a tarefa PDOEXEC, que, por padrão, executa o script SQL na transação. Quando ocorre o erro, o mecanismo de banco de dados reverte automaticamente suas alterações (mesmo as que estão na tabela de log de alterações - o banco de dados estará no estado anterior)

Exemplo:

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

Eu sei, este é um tópico muito antigo, mas talvez seja usado para outra pessoa. Você pode usar as instruções Try-> Catch para implementar uma solução para isso. Meu exemplo:

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

Por que não escrever uma série de deltas do desfazer e adicionar uma tarefa de phing que executa o fracasso da outra tarefa?

Você realmente deve dar uma olhada no Capistrano. TOMTOM: Você está perdendo alguma coisa aqui: o backup antes da mudança de esquema, é claro, deve ser feita - mas o que fazer com os novos dados que foram inseridos enquanto isso estava pensando que está tudo bem? Eu não digo, que existe uma boa ferramenta para esse problema, mas o problema existe na vida real.

A maneira "adequada" de fazer isso é um backup antes da mudança de esquema e depois reversão em caso de erro.

Você não diz o que o DB usa - mas me perguntaria se todas as alterações do esquema seriam suportadas nas transações. Os bancos de dados SQL da THIGH END END (Oracle, DB2, SQL Server) não fazem isso em todos os casos por razões realmente boas. As mudanças de esquema transacitonal são realmente difíceis e realmente reencontram intensivas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top