2017-02-07 4 views
1

데이터를 1 개의 테이블에서 2 개의 다른 테이블로 마이그레이션하는 데이터베이스 마이그레이션 작업을하고 있습니다. 이를 위해 PL/SQL 스크립트를 사용합니다.Liquibase 스크립트가 데이터를 유지하지 않습니다.

BEGIN 
    FOR foo IN (SELECT * FROM FOO) LOOP 
    INSERT INTO BAR (ID, STATUS) 
    VALUES (foo.ID, foo.STATUS); 

    FOR foolog IN (SELECT * FROM FOO_LOG where ID = foo.ID) LOOP 
     INSERT INTO BAR_LOG (ID, REV); 
     VALUES (FOO_SEQ.CURRVAL, foolog.REV); 
    END LOOP; 
    END LOOP; 
END; 

문제는 다음과 같습니다 : liquibase는 스크립트를 실행하지만,이 스크립트가 실행되지 않는 것처럼 보이는 데이터가 데이터베이스에 지속되지 않는 스크립트의 매우 단순화 된 버전은 아래에서 볼 수 있습니다. 오타를 의도적으로 도입하면 (예 : 테이블 이름 변경) 스크립트가 실행되지 않으므로 실제로 스크립트가 실행됩니다. 또한 SQL을 수동으로 실행하면 예상대로 작동하므로 문제가 liquibase와 관련이있는 것으로 보입니다.

왜 이런 일이 발생했는지/어떻게 해결할 수 있는지 실마리가 있습니까?

편집 : 사용

변경 집합 : 그것은 작동하지 않는 그것은 자신의 정말 바보 같은 실수 왜 발견

<changeSet id="2.4.0-03" author="bvandenberge"> 
    <sqlFile path="03-pie-conversion.sql" 
      relativeToChangelogFile="true" 
      plitStatements="false" /> 
    <rollback /> 
</changeSet> 
+1

어떤 시점에서'commit;을 한 적이 있습니까? 이것은 트랜잭션 기반 데이터베이스에 필요할 것입니다. –

+0

@ J.Chomel COMMIT를 추가하려고했습니다. END 직전. 그러나 이것은 행동을 변화시키지 않았다. 그 다음으로, liquibase에서 모든 변경 집합은 트랜잭션에서 실행되므로이 ​​경우 커밋을 처리해야합니다. – Bob

+0

이 ''은 무엇입니까? –

답변

0

. liquibase와 관련이 없습니다.

Intellij Oracle Console을 통해 테스트 데이터를 삽입합니다. 분명히이 콘솔은 기본적으로 트랜잭션에서 모든 것을 실행하지만 자동으로 커밋하지는 않습니다. 그래서 저는 Intellij를 통해 테스트 데이터를 삽입 한 다음 liquibase (Intellij의 트랜잭션이 커밋되지 않았기 때문에 데이터를 찾지 못했음)에서 스크립트를 실행 한 다음 Intellij에서 결과를 보려고했습니다. Intellij에서 테스트 데이터 트랜잭션을 수동으로 완료 한 후 모든 것이 정상적으로 작동했습니다.