2017-05-08 5 views
0

최근 플라이 웨이를 사용하여 SQL 데이터베이스를 제어하기 시작했습니다. 필자는 분기가 독립적으로 병합되고 배포 될 수있는 지속적인 통합 환경에서 작업 할 때 멱등 원 마이그레이션을 작성하고 Flyway에서 OutOfOrder를 true로 설정하는 것이 좋습니다.플라이 웨이를 사용할 때 멱등 원 이주

예를 들어, 테이블에 색인을 작성하는 등의 멱등 원 (idempotent) 이주는 다음과 같이 작동해야합니다. 1) 테이블이 존재하는지 확인하고 그렇지 않으면 테이블을 작성하십시오. 3) 열이 있는지 확인하고, 열이 없으면 열을 만듭니다. 2) 색인이 존재하는지 확인하고 색인이 존재하지 않는 경우 색인을 작성하십시오.

그 결과 큰 절차가 발생하고 테이블을 변경할 때마다이 절차를 반복해서 복사해야합니다.

그래서 지금 나는 약간 당황 스럽다. 이것이 연속적인 통합 환경에서 이동 경로를 구현하는 가장 좋은 방법입니까? 누구에게 더 좋은 제안이 있습니까?

도움 주셔서 감사합니다.

답변

0

1) 멱등 원 (Idempotent) 이주는 두 x 이상 실행될 수 있지만 한 x 만 실행 한 경우와 동일한 효과를 나타냄니다. 이를 달성하기 위해 데이터베이스 테이블을 수정할 때마다 테이블 작성 코드를 작성하는 데까지 갈 필요가 없습니다. 이것을 시도하는 것은 또한 매우 신속하게 유지하는 것이 불가능하게 될 것입니다.

기본적으로 이주 스크립트에 명령문을 작성할 때,이 명령문이 처음 실행되기 전에 데이터베이스의 상태를 알아야합니다. 이제 실행 된 적이 있더라도 오류없이 실행될 수 있도록 명령문을 수정해야하는지 생각하십시오.

예 : 데이터베이스는 상태 A에 당신은 B에 그걸 얻기 위해 마이그레이션 X를 실행하는 경우 :

M(A, x) -> B 

그런 다음 데이터베이스 상태가 여전히 B되도록 x가 실행 된 경우에도 X를 작성해야 다시 :

M(B, x) -> B 

이 (스크립트의 문 중 하나가 실패했지만 이전 사람이 성공했을 경우, 예를 들어 유용) 두 번 이상 같은 이주 스크립트를 실행 할 수 있습니다.

2) 다음으로 outOfOrder = true로 설정하면 이전 된 파일보다 이전 파일이 더 오래된 경우에도 아직 실행되지 않은 모든 파일을 실행할 수 있습니다. 따라서 x, y, z 세 순서로 (이 순서대로) x 및 z가 데이터베이스에 대해 실행되고 outOfOrder가 설정되지 않은 경우 z가 이미 실행되었으므로 flyway는 사용할 수있게되면 y를 실행하지 않습니다. 그러나 플래그를 true로 설정하면 기본적으로 y는 기본적으로 순서가 뒤떨어집니다 (z 이후). 이제 당신은 참으로 outOfOrder 설정하면

, 당신은이 가능성을 인식해야합니다 및 데이터베이스의 시작 상태는 데이터베이스에있는 지금은 두 개의 서로 다른 값을 가질 수 있습니다 전에 다음 A는 초기 인 경우

을 주 : Y는 RAN되기 전에

M(A, x) -> B 
M(B, y) -> C 
M(C, z) -> E 
(Taking the state from A -> B -> C -> E) 

M(A, x) -> B 
M(B, z) -> D 
M(D, y) -> E 
(Taking the state from A -> B -> D -> E) 

그래서, 상태 B 또는 D 일 수 중, Z는 RAN 전에 상태 이에 B 또는 C 일 수있다 하나는 Y 이주 스크립트 때문에 기록해야 그것은 멱등수 (idempotent) 일뿐만 아니라 시작 상태와 z가 실행 된 후에도 계속 작동 할 수 있습니다 (z는 올바르게 작동해야 함). f 또는 둘 다 B와 C 상태).