[sql] 데이터베이스 구조 변경을위한 버전 관리 시스템이 있습니까?

나는 종종 다음과 같은 문제에 직면합니다.

데이터베이스에 새 테이블이나 열이 필요한 프로젝트의 일부 변경 작업을 수행합니다. 데이터베이스를 수정하고 작업을 계속합니다. 일반적으로 라이브 시스템에서 복제 할 수 있도록 변경 사항을 기록해 두는 것을 기억합니다. 그러나 나는 내가 무엇을 바꿨는지 항상 기억하지 못하고 그것을 적어 두는 것을 항상 기억하지 않는다.

그래서 라이브 시스템으로 밀어 NewColumnX붙이고, ugh 가 없다는 크고 명백한 오류가 발생합니다 .

이것이이 상황에 대한 모범 사례가 아닐 수도 있다는 사실과 상관없이 데이터베이스에 대한 버전 제어 시스템이 있습니까? 특정 데이터베이스 기술은 신경 쓰지 않습니다. 나는 그저 존재하는지 알고 싶다. MS SQL Server에서 작동한다면 훌륭합니다.



답변

Ruby on Rails에는 마이그레이션 의 개념 이 있습니다. 데이터베이스를 변경하는 빠른 스크립트입니다.

db 버전을 높이는 규칙 (예 : 열 추가)과 버전을 다운 그레이드하는 규칙 (예 : 열 제거)이있는 마이그레이션 파일을 생성합니다. 각 마이그레이션에는 번호가 매겨지며 테이블은 현재 db 버전을 추적합니다.

마이그레이션 하려면 버전을 확인하고 필요한 스크립트를 적용하는 “db : migrate”라는 명령을 실행합니다. 비슷한 방법으로 아래로 마이그레이션 할 수 있습니다.

마이그레이션 스크립트 자체는 버전 제어 시스템에 보관됩니다. 데이터베이스를 변경할 때마다 새 스크립트를 체크인하고 모든 개발자가이를 적용하여 로컬 DB를 최신 버전으로 가져올 수 있습니다.


답변

나는 데이터베이스를 만들기 위해 소스 파일을 사용한다는 점에서 약간 구식입니다. 실제로 두 개의 파일 (project-database.sql 및 project-updates.sql)이 있습니다. 첫 번째는 스키마 및 지속성 데이터 용이고 다른 하나는 수정 용입니다. 물론 둘 다 소스 제어하에 있습니다.

데이터베이스가 변경되면 먼저 project-database.sql의 기본 스키마를 업데이트 한 다음 관련 정보를 project-updates.sql에 복사합니다 (예 : ALTER TABLE 문). 그런 다음 업데이트를 개발 데이터베이스에 적용하고 테스트하고 잘 완료 될 때까지 반복 할 수 있습니다. 그런 다음 파일을 체크인하고 다시 테스트하고 프로덕션에 적용하십시오.

또한 일반적으로 db-Config에 다음과 같은 테이블이 있습니다.

SQL

CREATE TABLE Config
(
    cfg_tag VARCHAR(50),
    cfg_value VARCHAR(100)
);

INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');

그런 다음 업데이트 섹션에 다음을 추가합니다.

UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';

db_version는 데이터베이스가 다시 때 변화 도착하고는 db_revision나에게 DB를 기준 떨어져 얼마나 멀리 표시를 제공합니다.

업데이트를 별도의 파일에 보관할 수 있지만 모두 함께 매시고 잘라 내기 및 붙여 넣기를 사용하여 관련 섹션을 추출하도록 선택했습니다. 좀 더 정리가 필요합니다. 즉, $ Revision 1.1 $에서 ‘:’을 제거하여 고정합니다.


답변

MyBatis (이전의 iBatis)에는 명령 줄에서 사용할 수 있는 스키마 마이그레이션 도구가 있습니다. Java로 작성되었지만 모든 프로젝트에서 사용할 수 있습니다.

좋은 데이터베이스 변경 관리 관행을 달성하려면 몇 가지 주요 목표를 식별해야합니다. 따라서 MyBatis Schema Migration System (또는 줄여서 MyBatis Migrations)은 다음을 추구합니다.

  • 신규 또는 기존 데이터베이스로 작업
  • 소스 제어 시스템 (예 : Subversion) 활용
  • 동시 개발자 또는 팀이 독립적으로 작업 할 수 있습니다.
  • 충돌을 눈에 잘 띄고 쉽게 관리 할 수 ​​있습니다.
  • 순방향 및 역방향 마이그레이션 허용 (각각 진화, 위임)
  • 데이터베이스의 현재 상태를 쉽게 액세스하고 이해할 수 있도록합니다.
  • 액세스 권한 또는 관료주의에도 불구하고 마이그레이션 가능
  • 모든 방법론으로 작업
  • 우수하고 일관된 관행을 장려합니다.

답변

Redgate에는 SQL Source Control 이라는 제품이 있습니다. TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce 및 Git과 통합됩니다.


답변

SQL delta를 적극 권장 합니다. 기능 코딩을 마쳤을 때 diff 스크립트를 생성하고 해당 스크립트를 소스 제어 도구로 확인하는 데 사용합니다 (Mercurial :)).

SQL 서버와 Oracle 버전이 모두 있습니다.


답변

Java 기반이며 jdbc를 지원하는 거의 모든 데이터베이스에서 작동 해야하는 오픈 소스 도구 liquibase에 대해 언급 한 사람이 아무도 없었는지 궁금합니다 . rails와 비교하면 ruby ​​대신 xml을 사용하여 스키마 변경을 수행합니다. 도메인 특정 언어에 대한 xml을 싫어하지만 xml의 매우 멋진 장점은 liquibase가 다음과 같은 특정 작업을 롤백하는 방법을 알고 있다는 것입니다.

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

따라서 직접 처리 할 필요가 없습니다.

순수 SQL 문 또는 데이터 가져 오기도 지원됩니다.


답변

대부분의 데이터베이스 엔진은 데이터베이스를 파일로 덤프하는 것을 지원해야합니다. 어쨌든 MySQL이 그렇다는 것을 알고 있습니다. 이것은 텍스트 파일 일 뿐이므로 Subversion 또는 사용하는 무엇이든 제출할 수 있습니다. 파일에 대한 차이점도 쉽게 실행할 수 있습니다.