2012-08-23 3 views
1

우리는 java 및 oracle 11g를 사용하여 고객을위한 웹 기반 솔루션을 개발 중입니다. 프로젝트는 고객을 위해 설치되지만 대부분의 기능은 개발 중입니다. 매월 고객 사이트에 설치해야하는 새 버전을 출시합니다. 문제는 각 릴리스에서 DB (테이블, 뷰, SP, 트리거 등)에 많은 변화가 있다는 것입니다. 개발 라인에서 덤프를 가져 와서 고객 사이트로 가져갈 수는 없습니다.이전 DB에서 새 DB로 마이그레이션 할 SQL 스크립트를 생성하는 방법은 무엇입니까?

질문은 고객 DB의 스키마를 새 버전 (개발 버전)으로 마이그레이션 할 수있는 SQL 스크립트를 어떻게 생성 할 수 있습니까? 이 스크립트를 생성하기위한 자동화 도구가 있습니까? 거기에 할 수있는 자바에 어떤 오픈 소스 코드가 있습니까? 이 문제에 대한 모범 사례?

편집

는 답변에 따르면, 가장 좋은 방법은 DB 계획의 직접적인 변화에서 개발자를 금지하는 것입니다 그들이 작성하고 각 DB 업데이트를 변경 스크립트를 저지해야한다는 것. 하지만이 방법을 사용하면 잠시 후에 변경 스크립트가 많이 존재하게되며 각 스크립트에는 DB에 특정 업데이트가 있습니다. 이러한 대량의 스크립트를 어떻게 관리 할 수 ​​있습니까?

+0

나는 공구가 존재한다고 생각하지만 나는 어떤 이름을 모른다. 하지만이를 관리하는 방법은 일반적으로 SQL 스크립트의 히스토리를 유지하는 VCS를 사용하는 것입니다. VCS는 소프트웨어의 버전 2 사이에서 수정을 쉽게 관리합니다. 예를 들어, 처음부터 데이터베이스를 빌드하는 하나의 creation.sql 스크립트. 다른 하나는 수정을 다룹니다.따라서 처음으로 클라이언트가 projet을 전달할 때 클라이언트는 creation.sql 파일을 사용합니다. 그렇지 않으면 update-1.2.1.sql (예 : :) 이것이 다음에 도움이되기를 바랍니다. 문안 인사. –

답변

4

당신이 기술 한 상태를 감안할 때, 이전 릴리스와 다음 릴리스간에 지점 간 마이그레이션 스크립트를 작성하는 것이 좋습니다.

데이터베이스은 diff 도구가 존재 할 수 있지만, 가장이 블로그 게시물에 의해 설명 된 개념의 일반적인 결함이있다 :

http://blog.liquibase.org/2007/06/the-problem-with-database-diffs.html

TL; DR : 한은 diff 도구는 특정 변화의 컨텍스트를 확인할 수 없습니다. 예를 들어, 개발 과정에서 열 이름의 철자 오류를 정정 한 경우 기존 데이터베이스에서 RENAME COLUMN 명령을 사용하여 테이블이 보유한 데이터를 보존해야합니다. 데이터베이스 비교 도구는 새 스키마에 존재하지 않는 이전 열과 이전 스키마에없는 새로운 열만 볼 수 있습니다. 따라서이 도구는 이전 열을 삭제하고 새 열을 추가하지만 결과적으로 해당 열에 있던 모든 데이터가 사라졌습니다.

모범 사례로 이동하면서 사전에 데이터베이스 변경 내용을 추적하는 것이 좋습니다. Django와 Ruby on Rails와 같은 새로운 웹 프레임 워크는 즉시 추적 할 수있는 마이그레이션 추적을 지원하지만, Liquibase와 같은 오픈 소스 솔루션은 Java 세계에서도 존재합니다. 우리는 현재 회사에서 Liquibase를 사용하고 있으며, 지금까지 마이그레이션 비용을 최소화하는 데 큰 성공을 거두었습니다. 우리는 당신이 지금 직면하고있는 그러한 이주를 통해 표류하는 것을 뒤돌아 보았습니다.

행운을 빈다.

+0

좋은 지적. 감사. : -) – hsalimi

+0

+1 for Liquibase –

2

데이터베이스 변경은 소스 제어에 넣은 스크립트를 통해서만 이루어져야합니다. 그렇게하면 Qa로 무엇을 옮겨야하는지 알지 못하고 문제를 일으키지 않습니다. 게다가 스크립트는 끝에 스크립트를 작성하고 prod에서 처음 실행하는 것과 달리 테스트되었습니다. 또한 다른 프로젝트의 일부 변경 사항은 소스 컨트롤의 다른 분기에 있기 때문에 준비가되지 않았을 때 우발적으로 적용되지 않습니다. SQL 코드는 코드이므로 소스 컨트롤과 관련하여 다른 모든 코드와 똑같이 처리해야합니다.

+0

하지만 방법을 사용하면 잠시 후에 변경 스크립트가 많이 존재하게되며 각 스크립트는 내 DB에 특정 업데이트를 보관합니다. 어떻게 이러한 대량의 스크립트를 관리 할 수 ​​있습니까? – hsalimi

관련 문제