본문 바로가기

SQL Server/SQL Server 형상 관리

[Sequel Safe] 데이터베이스 빌드와 배포

개발이 막 끝난 코드가 바로 프로덕트 코드로 사용되는 경우는 드뭅니다.

회사마다 차이가 있겠지만, 보통 개발망과 Release망 사이에는 여러 단계의 배포 계층이 있게 마련입니다.




Sequel Safe에서는 배포 계층을 크게 3가지로 나눕니다.

1. development
2. intermediate - development와 release 사이의 모든 계층 (QA, RC 등의 목적)
3. release or product


배포 작업에 대한 선행 작업은 "배포 대상 데이터베이스의 생성"과 "데이터베이스 빌드" 입니다.


I. 배포 대상 데이터베이스 생성

각 망은 분리된 인스턴스이므로, 아래와 같이 3개의 인스턴스를 사용하여 샘플 데이터베이스를 구성합니다.

1. QA 망
두번째 인스턴스에 Demo DB를 생성하도록 하겠습니다.

SSMS에서 아래 파일을 열고 Ctrl + Shift + M을 눌러, DB이름을 Demo라고 지정한 후 실행합니다.
Gen_IntermediateDB.sql

2. 프로덕트 망 ( = Release망)
마찮가지 방법으로 세번째 인스턴스에 Demo DB를 생성합니다.
Gen_ProductDB.sql

주의!!!
아래 스크립트는 멀티 인스턴스가 설치된 SQL Server에는 적합하지 않습니다.
멀티 인스턴스 환경이라면, CREATE DATABAE 구문을 적절히 수정하여 사용하십시오.


이제 아래와 같이 구성되었습니다.






II. 데이터베이스 빌드 및 배포

A. 첫번째 시나리오

1. SQL 개발자인 홍길동님은 Demo DB를 만들고 자체 테스트를 완료했습니다.

2. QA팀이 테스트할 수 있도록 QA망에 배포해야 하는데, DBA에게 문의해보니 이미 QA망에 Demo DB를 설치해 두었다고 합니다. (위에서와 같이 이름만 있는 빈 DB입니다.)

3. 개발망에서 현재 상태의 Demo DB를 첫번째 버전으로 빌드합니다.

USE SQLSafe;

GO

 

EXEC dbo.P_AddDeploymentScript @nvcDatabaseName = N'Demo';

GO



4. 빌드된 배포 스크립트 목록을 조회합니다.
    - 배포 스크립트 1번이 생성되어 있음을 확인!!!

USE SQLSafe;

GO

 

EXEC dbo.P_GetPageDeploymentScript 1, 10, 1, N'Demo';

GO





5. 배포할 스크립트를 추출합니다.

USE SQLSafe;

GO

 

EXEC dbo.P_GetDeploymentScript @intDeploymentScriptSN = 1;

GO





Message 창에 출력된 스크립트를 첨부합니다.
Demo_Build1.sql


6. 추출한 배포 스크립트를 QA 망의 Demo DB에서 실행합니다.

- QA 망 Demo DB에 아래와 같이 개체가 추가되었음을 확인할 수 있습니다.
- dbo.DatabaseVersion 테이블은 개발망에 없는 테이블이지만, QA 망과 프로덕트 망에는 자동 추가됩니다.
  이 테이블의 내용을 통해 현재 DB의 빌드 넘버 (또는 버전)을 체크하게 됩니다.




B. 두번째 시나리오
1. QA팀에서 테스트가 진행되는 동안, 새로운 개발 이슈가 발생하였습니다.

2. 두가지 기능이 추가되어야 하는데, 한가지 기능은 홍길동님이 구현하고, 나머지 기능은 마루치님이 구현하기로 하였습니다.

3. 마루치님은 SP를 1개 추가하였고, 기능 구현이 완료되었습니다. (P_AddArticle 이라는 이름의 SP를 생성합니다.)

4. 홍길동님은 SP를 1개 추가한 상태이고, 아직 작업 중입니다. (P_GetPageArticle 이라는 이름의 SP를 생성합니다.)

5. QA팀에서 마루치님이 구현한 기능을 테스트해야하기 때문에 Demo DB를 QA망에 배포해 달라고 합니다.

6. 마루치님은 Demo DB의 최종 빌드 이후 변경된 개체의 목록을 조회합니다.

USE SQLSafe;

GO

 

EXEC dbo.P_GetListNotDeployedObject N'Demo';

GO





7. 마루치님이 홍길동님에게 P_GetPageArticle 이라는 SP를 QA망에 배포해도 되는지 확인합니다.
   물론, 홍길동님은 그 SP가 아직 배포되면 안된다고 말합니다.

8. P_GetPageArticle을 제외한 모든 변경 내역을 포함하도록 새로운 버전을 빌드합니다.

USE SQLSafe;

GO

 

DECLARE @intDeploymentScriptSN int;

 

EXEC dbo.P_AddDeploymentScript

      @nvcDatabaseName = N'Demo' -- 데이터베이스이름.

    , @nvcTargetProcName = NULL -- ,를구분자로하는배포대상저장프로시저이름.

    , @nvcExceptProcNames = N'P_GetPageArticle' -- ,를구분자로하는배포제외저장프로시저이름.

    , @dtmLimitDate = NULL -- 이날짜이전에실행된DDL문만을배포대상으로합니다.

    , @intDeploymentScriptSN = @intDeploymentScriptSN OUTPUT; -- 배포시리얼번호.

 

SELECT @intDeploymentScriptSN AS [@intDeploymentScriptSN];

GO





9. 빌드된 배포 스크립트 목록을 조회합니다.
    - 배포 스크립트 2번이 추가로 생성되어 있음을 확인!!!

USE SQLSafe;

GO

 

EXEC dbo.P_GetPageDeploymentScript 1, 10, 1, N'Demo';

GO





10. 배포 스크립트를 추출합니다.

USE SQLSafe;

GO

 

EXEC dbo.P_GetDeploymentScript @intDeploymentScriptSN = 2;

GO




Message 창에 출력된 스크립트를 첨부합니다.
Demo_Build2.sql


11. 추출한 배포 스크립트를 QA 망의 Demo DB에서 실행합니다.

P_AddArticle이 배포되어 있습니다.




Release 망으로 배포할 때도 같은 프로세스를 사용합니다.