문제

나는 사용 중입니다 phing'에스 DBDEPLOY 작업 에게 내 데이터베이스 스키마를 관리합니다. 델타 파일의 쿼리에 오류가없는 한 이것은 잘 작동합니다.

그러나 오류가 있으면 DBDEPLOY는 델타 파일을 오류로 쿼리로 실행 한 다음 중단합니다. 이것은 Changelog 테이블의 항목을 수동으로 롤백해야하기 때문에 약간의 좌절을 유발합니다. 그렇지 않으면 DBDEPLOY는 후속 시도에서 마이그레이션이 성공했다고 가정하므로 모든 재료는 아무것도하지 않습니다.

그래서 문제는 DBDeploy 사용 트랜잭션을 얻을 수있는 방법이 있습니까? 아니면 오류가 발생할 때 다른 방법으로 Phing 롤백을 자동으로 제안 할 수 있습니까??

메모: 나는 phing에 능숙하지 않기 때문에 사용자 정의 작업을 작성하는 경우 예제 코드 또는 추가 정보가있는 URL에 높이 평가됩니다. 감사

도움이 되었습니까?

해결책

DB 덤프 작업에 대한 페이 핑과 관련하여 DB의 덤프 유틸리티를 사용하고 피싱 작업을 만듭니다. 나는 주로 Postgres를 사용하고 내 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>

다른 팁

문제를 해결하는 가장 간단한 방법은 기본적으로 트랜잭션에서 SQL 스크립트를 실행하는 PDOEXEC 작업을 사용하는 것입니다. 오류가 발생하면 데이터베이스 엔진이 자동으로 변경됩니다 (변경 로그 테이블의 변경 사항조차도 데이터베이스가 이전 상태에 있습니다).

예시:

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

나는 이것이 매우 오래된 스레드이지만 다른 사람에게 가득 차게 될 것입니다. Try-> Catch 문을 사용하여 솔루션을 구현할 수 있습니다. My example :

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

일련의 실행 취소 델타를 작성하고 다른 작업의 실패로 실행되는 페이 작업을 추가 해보십시오.

당신은 정말로 Capistrano를 살펴 봐야합니다. Tomtom : 여기에 뭔가 누락되었습니다 : 스키마 변경 전 백업은 물론 이루어져야합니다. 그러나 삽입 된 새로운 데이터는 모든 것이 정상이라고 생각하고 있었습니까? 나는이 문제에 대한 좋은 도구가 있지만 실제 생활에는 문제가 존재합니다.

이를 수행하는 "적절한"방법은 스키마 변경 전 백업이며 오류가 발생한 경우 롤백입니다.

당신은 당신이 어떤 DB를 사용하는지 말하지 않지만 모든 스키마 변경이 트랜잭션에서 지원되는지 궁금합니다. MOS 허벅지 엔드 SQL 데이터베이스 (Oracle, DB2, SQL Server)는 모든 경우에 모든 경우에 그렇게하지 않습니다. 경작 스키마 변경은 실제로 어렵고 집중적 인 집중적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top