문제

DB 스키마 변경 사항을 추적하기 위한 메커니즘을 설정하고 싶습니다. 이 답변:

데이터베이스에 대한 모든 변경에 대해 새로운 마이그레이션을 작성합니다.마이그레이션에는 일반적으로 두 가지 방법이 있습니다.변경 사항이 적용되는 "UP"방법과 변경이 취소되는 "다운"방법.단일 명령은 데이터베이스를 최신으로 제공하며 데이터베이스를 특정 버전의 스키마로 가져 오는 데 사용될 수도 있습니다.

내 질문은 다음과 같습니다."up" 메소드의 모든 DDL 명령은 되돌릴 수 있습니까?즉, 항상 "down" 메소드를 제공할 수 있습니까?"다운"할 수 없는 DDL 명령을 상상할 수 있습니까?

"up" 방법 중에 데이터가 손실되는 일반적인 데이터 마이그레이션 문제를 고려하지 마십시오.예를 들어필드 유형 변경 datetime (DateOfBirth) 에게 int (YearOfBirth) 복원할 수 없는 데이터가 손실되고 있습니다.

도움이 되었습니까?

해결책

SQL Server에서 내가 아는 모든 DDL 명령은 위/다운 쌍입니다.

다른 팁

데이터 손실 외에, 내가 한 모든 마이그레이션은 가역적입니다. 즉, Rails는 마이그레이션을 "파괴적"으로 표시하는 방법을 제공합니다.

일부 변형은 역전 할 수없는 방식으로 파괴적입니다. 그러한 종류의 마이그레이션은 다운 방법에서 activerecord :: irreversiblemmed exception을 제기해야합니다.

API 문서를 참조하십시오 여기.

예, 데이터를 변환하거나 "상향" 마이그레이션에서 단순히 DROP COLUMN을 통해 데이터가 손실되는 사례를 확인했습니다.

또 다른 예는 SEQUENCE 객체를 삭제하여 해당 상태를 잃을 수 있다는 것입니다."다운" 마이그레이션은 시퀀스를 다시 생성하지만 1부터 다시 시작됩니다.이로 인해 시퀀스에서 중복 값이 ​​생성될 수 있습니다.빈 데이터베이스에서 마이그레이션을 수행하고 시퀀스가 ​​1부터 시작되기를 원하는 경우에는 문제가 되지 않지만, 데이터 행 수가 어느 정도 있는 경우 시퀀스를 가장 큰 값으로 재설정하고 싶을 것입니다. 현재 사용 중입니다. 해당 테이블에 대한 배타적 잠금이 없으면 안정적으로 수행하기 어렵습니다.

데이터베이스의 데이터 상태에 의존하는 다른 DDL에도 비슷한 문제가 있습니다.애초에 그것은 좋은 스키마 디자인이 아닐 수도 있습니다. 귀하의 질문에 맞는 사례를 생각하려고 노력하고 있습니다.

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