[sql-server] 버전 관리 SQL Server 데이터베이스

데이터베이스를 버전 관리하에두고 싶습니다. 누구든지 나를 시작할 수있는 조언이나 권장 기사가 있습니까?

나는 항상 최소한 몇 가지 데이터를 원할 것입니다 ( 명백한 언급 : 사용자 유형 및 관리자). 또한 성능 측정을 위해 생성 된 대규모 테스트 데이터 모음을 원할 수도 있습니다.



답변

Martin Fowler는이 주제에 대해 내가 가장 좋아하는 기사 ( http://martinfowler.com/articles/evodb.html)를 썼습니다 . 나는 alumb 과 같이 스키마 덤프를 버전 제어하에 두지 않기로 선택 하고 다른 사람들은 프로덕션 데이터베이스를 쉽게 업그레이드 할 수 있기를 원하기 때문에 제안합니다.

단일 프로덕션 데이터베이스 인스턴스가있는 웹 애플리케이션의 경우 두 가지 기술을 사용합니다.

데이터베이스 업그레이드 스크립트

스키마를 버전 N에서 N + 1로 이동하는 데 필요한 DDL을 포함하는 시퀀스 데이터베이스 업그레이드 스크립트. (이것은 버전 관리 시스템에 있습니다.) _version_history_ 테이블은 다음과 같습니다.

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

업그레이드 스크립트가 실행될 때마다 새 버전에 해당하는 새 항목을 가져옵니다.

이를 통해 어떤 버전의 데이터베이스 스키마가 있는지 쉽게 확인할 수 있으며 데이터베이스 업그레이드 스크립트가 한 번만 실행됩니다. 다시 말하지만 이들은 데이터베이스 덤프 가 아닙니다 . 오히려 각 스크립트는 한 버전에서 다음 버전으로 이동하는 데 필요한 변경 사항을 나타냅니다 . “업그레이드”하기 위해 프로덕션 데이터베이스에 적용하는 스크립트입니다.

개발자 샌드 박스 동기화

  1. 프로덕션 데이터베이스를 백업, 삭제 및 축소하는 스크립트 프로덕션 DB로 업그레이드 할 때마다이를 실행하십시오.
  2. 개발자 워크 스테이션에서 백업을 복원하고 필요한 경우 조정하는 스크립트입니다. 각 개발자는 프로덕션 DB로 업그레이드 한 후이 스크립트를 실행합니다.

경고 : 자동화 된 테스트는 스키마가 정확하지만 비어있는 데이터베이스에 대해 실행되므로이 ​​조언은 사용자 요구에 완벽하게 맞지 않습니다.


답변

Red Gate의 SQL Compare 제품을 사용하면 객체 수준 비교를 수행하고 그로부터 변경 스크립트를 생성 할 수있을뿐만 아니라 데이터베이스 객체를 하나의 [objectname] .sql 작성을 사용하여 객체 유형별로 구성된 폴더 계층 구조로 내보낼 수도 있습니다. 이 디렉토리의 오브젝트 당 스크립트. 객체 유형 계층 구조는 다음과 같습니다.

\ 기능
\ 보안
\ 보안 \ 역할
\ 보안 \ 스키마
\ 보안 \ 사용자
\ 저장 프로 시저
\ 테이블

변경 후 스크립트를 동일한 루트 디렉토리에 덤프하면이를 사용하여 SVN 저장소를 업데이트하고 각 오브젝트의 실행 히스토리를 개별적으로 유지할 수 있습니다.


답변

이것은 개발을 둘러싼 “어려운 문제”중 하나입니다. 내가 아는 한 완벽한 솔루션은 없습니다.

데이터가 아닌 데이터베이스 구조 만 저장해야하는 경우 데이터베이스를 SQL 쿼리로 내보낼 수 있습니다. (Enterprise Manager : 데이터베이스-> SQL 스크립트 생성을 마우스 오른쪽 단추로 클릭하십시오. 옵션 탭에서 “개체 당 하나의 파일 작성”을 설정하는 것이 좋습니다.) 그런 다음이 텍스트 파일을 svn에 커밋하고 svn의 diff 및 logging 기능을 사용할 수 있습니다.

나는 이것을 몇 가지 매개 변수를 취하고 데이터베이스를 설정하는 배치 스크립트와 함께 묶었습니다. 또한 사용자 유형 및 관리자와 같은 기본 데이터를 입력하는 추가 쿼리를 추가했습니다. (이에 대한 자세한 정보를 원하면 뭔가를 게시하면 스크립트를 액세스 가능한 곳에 둘 수 있습니다)

모든 데이터를 유지해야하는 경우 데이터베이스 백업을 유지 하고 비교를 수행하기 위해 Redgate ( http://www.red-gate.com/ ) 제품을 사용하는 것이 좋습니다 . 그들은 싸게 오지 않지만 모든 페니의 가치가 있습니다.


답변

먼저, 올바른 버전 관리 시스템을 선택해야합니다.

  • 중앙 집중식 버전 제어 시스템-사용자가 파일 작업 전후에 체크 아웃 / 체크인하고 파일이 단일 중앙 서버에 유지되는 표준 시스템

  • 분산 버전 제어 시스템-리포지토리가 복제되고 각 복제본이 실제로 리포지토리의 전체 백업이므로 시스템에 충돌이 발생하면 복제 된 리포지토리를 사용하여 복원 할 수 있습니다. 모든 버전 제어 시스템의 핵심 인 저장소를 설정해야합니다.이 모든 내용은 다음 기사에서 설명합니다. http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding -source-control-basics /

리포지토리를 설정 한 후 중앙 버전 제어 시스템의 경우 작업 폴더 인 경우이 기사를 읽을 수 있습니다 . 다음을 사용하여 개발 환경에서 소스 제어를 설정하는 방법을 보여줍니다.

  • MSSCCI 공급자를 통한 SQL Server Management Studio

  • Visual Studio 및 SQL Server 데이터 도구

  • 타사 도구 ApexSQL 소스 제어

답변

Red Gate 에서는 SQL 비교 기술을 사용하여 데이터베이스를 TFS 또는 SVN 저장소와 연결 하는 도구 인 SQL Source Control을 제공 합니다. 이 도구는 SSMS에 통합되어 있으며 이제 개체를 커밋 할 수 있다는 점을 제외하고 정상적으로 작업 할 수 있습니다.

마이그레이션 기반 접근 방식 (자동 배포에 더 적합)을 위해 Visual Studio 프로젝트로 증분 스크립트 집합을 만들고 관리하는 SQL Change Automation (이전의 ReadyRoll)을 제공합니다.

SQL 소스 제어에서 정적 데이터 테이블을 지정할 수 있습니다. 이들은 소스 제어에 INSERT 문으로 저장됩니다.

테스트 데이터에 대해 이야기하는 경우 도구를 사용하거나 정의한 배포 후 스크립트를 통해 테스트 데이터를 생성하거나 프로덕션 백업을 개발 환경으로 간단히 복원하는 것이 좋습니다.


답변

Liquibase ( http://www.liquibase.org/ ) 를보고 싶을 수도 있습니다 . 도구 자체를 사용하지 않더라도 데이터베이스 변경 관리 또는 리팩토링 개념을 잘 처리합니다.


답변

RedGate 도구를 추천 한 모든 사용자에게 +1, 추가 권장 사항 및 경고가 있습니다.

SqlCompare에는 문서화 된 API도 있습니다. 예를 들어, 소스 제어 스크립트 폴더를 체크인시 CI 통합 테스트 데이터베이스와 동기화하는 콘솔 앱을 작성하여 누군가가 스크립트 폴더에서 스키마 변경을 체크인 할 때 일치하는 응용 프로그램 코드 변경과 함께 자동으로 배포됩니다. 이를 통해 로컬 DB의 변경 사항을 공유 개발 DB로 전파하는 것을 잊어 버린 개발자와의 격차를 좁힐 수 있습니다 (우리 중 절반 정도 🙂

스크립트 솔루션이나 그 밖의 방법으로 RedGate 도구가 충분히 매끄 럽기 때문에 추상화의 기본이되는 SQL 현실을 쉽게 잊을 수 있습니다. 테이블의 모든 열 이름을 바꾸면 SqlCompare는 이전 열을 새 열에 매핑 할 수 없으며 테이블의 모든 데이터를 삭제합니다. 경고가 발생하지만 사람들이 그 과거를 클릭하는 것을 보았습니다. 여기에는 일반적으로 DB 버전 관리 및 업그레이드 만 자동화 할 수 있다고 생각할 가치가 있습니다. 추상화는 매우 누수가 있습니다.