데이터베이스 패키지 및 업그레이드 패키지 스 크 립 트 도구 RedGate 사용 안내

이 로 그 는 내 가 회사 에서 배 운 데이터베이스 패키지 의 디자인 을 기록 했다.마침 이 내용 들 도 제 가 최근 에 일 을 하면 서 겪 은 문제 들 입 니 다.여기 서 기록 하고 공유 하 겠 습 니 다.
제품 의 개발 과 버 전 업데이트 과정 에서 데이터 뱅 크 의 구 조 는 계속 변화 할 수 밖 에 없다.업그레이드 시의 작업량 을 최대한 줄 이기 위해 서 는 좋 은 데이터 베이스 업그레이드 방식 을 설계 하 는 것 이 중요 하 다.데이터베이스 패 키 지 를 설계 할 때,새로 설치 할 때 기본 데 이 터 를 어떻게 생 성 하 는 지 를 고려 해 야 할 뿐만 아니 라,오래된 버 전에 서 업 그 레이 드 될 때 오래된 데 이 터 를 어떻게 이전 하 는 지도 고려 해 야 한다.필요 하 다 면)
기본적으로 설치 패 키 지 는 세 부분 으로 나 눌 수 있 습 니 다.Pre-script,데이터베이스 설치 또는 업그레이드 와 Post-script 입 니 다.
1.데이터베이스 설치 또는 업그레이드
우선 우리 가 사용 한 것 은 레 드 게 이 트 도구 다.이 도 구 는 기 존 데이터베이스 와 대상 데이터베이스 의 구조 적 차 이 를 자동 으로 비교 하고 스 크 립 트 를 자동 으로 생 성하 여 업그레이드 합 니 다(실제로 일련의 SQL 문 구 를 실행 합 니 다).이것 은 아주 좋 은 도구 입 니 다.추천 해서 사용 하면 많은 작업량 을 줄 일 수 있 습 니 다.
레 드 게 이 트 가 이전 버 전의 데이터베이스 에 대상 표 가 존재 하지 않 는 다 는 것 을 발견 하면 자동 으로 이 표를 만 들 고 메 인 키,외부 키 와 다른 제약 조건 을 설정 합 니 다.이 건 할 말 이 없어 요.
목표 표 가 이미 존재 한다 면 기 존의 표를 업데이트 할 것 입 니 다.변경 할 표 구조 가 어떻게 변화 하 는 지 특히 주의해 야 합 니 다.예 를 들 어:
우 리 는 원래 User Parameter 표를 가지 고 있 었 는데 구 조 는 다음 과 같다.

현재,우 리 는 파라미터 Type 필드 를 추가 하여 UserId 필드 와 연합 키 를 구성 하 기 를 희망 합 니 다.

이 경우 이전 버 전의 데이터베이스 에 데이터 가 있 으 면 업그레이드 과정 에서 새 필드 를 추가 한 후 ParameterType 이 비어 있 기 때문에 표 의 구조 수정 에 실패 하고 패 키 지 를 설치 하 는 데 오류 가 발생 할 수 있 습 니 다.
해결 방법 은 이 필드 에 기본 값 을 추가 하 는 것 입 니 다.일반적인 방법 은 데이터베이스 프로젝트 의 Schema Objects C Tables C Contraints 에 Default Constraint 의 제약 조건 을 추가 하 는 것 입 니 다.

ALTER TABLE [TMS].[UserParameters]
   ADD CONSTRAINT [DF_UserParameters_Type]
   DEFAULT N'SU'
   FOR [ParameterType]
2.Pre-script 와 Post-script
일반적으로 대부분의 데이터 시트 의 구조 변 화 는 RedGate 가 자동 으로 완성 할 수 있 습 니 다.우리 가 해 야 할 일 은 기본 값 을 설정 하 는 것 만 주의 하면 됩 니 다.하지만 스스로 스 크 립 트 를 써 서 완성 해 야 하 는 경우 도 있다.여기 서 몇 가지 예 를 들 자.
1.기본 데이터
기본 데 이 터 는 데이터 베 이 스 를 만 든 후에 추 가 됩 니 다.Post-script 에 Default Data.sql 이라는 스 크 립 트 를 추가 할 수 있 습 니 다.범례 는 다음 과 같 습 니 다.

SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRANSACTION
-- New default for FloorAlertOrder
IF NOT EXISTS (SELECT 1 FROM TMS.[FloorAlertOrder] WHERE [ModeId] = 1 and [TypeId] = 7)
   INSERT INTO [TMS].[FloorAlertOrder] ([TypeId], [Ordinal], [ModeId]) VALUES (7, 10, 1)

-- TMS.User

IF NOT EXISTS (SELECT 1 from [TMS].[User] where XRef = 'Host')
    INSERT INTO [TMS].[User]
           ([Active]
           ,[XRef]
           ,[LastName]
           ,[FirstName]
           ,[UserName]
           ,[CreationTime]
           ,[Dealer]
           ,[CasinoHost]
           ,[DomainName]
           ,[CMSUserName])
     VALUES
           (1
           ,'Host'
           ,'Host'
           ,'Host'
           ,'Host'
           ,GETUTCDATE()
           ,0
           ,0
           ,'Host'
           ,'Host')
COMMIT TRANSACTION
GO

이 스 크 립 트 에서 유일 하 게 고려 해 야 할 것 은 데이터베이스 가 반드시 비어 있 는 것 이 아니 라 업 그 레이 드 된 것 일 수 있 기 때문에 원래 데이터 가 있 는 지 없 는 지 판단 해 야 한다.또한 이 스 크 립 트 를 쓸 때 는 트 랜 잭 션 에 두 는 것 이 좋 습 니 다.설치 에 실 패 했 을 때 제출 하지 않 은 데 이 터 를 취소 하면 사용자 가 문 제 를 조사 한 후에 바로 다시 설치 할 수 있 습 니 다.
2.어떤 필드 에 변화 발생
예 를 들 어 우 리 는 Rating 표 가 있 는데 그 안에 TerminalId 필드 가 있 는데 원래 VARCHAR 유형 이 고 기계 이름 을 기록 했다.현재 우리 의 새 버 전 은 이 필드 의 종 류 를 int 형식 으로 바 꾸 고 Terminal 표 와 연 결 된 외부 키 제약 을 추가 합 니 다.이런 상황 에 대해 서 는 우리 스스로 스 크 립 트 를 써 야 한다.
우선 포스트 스 크 립 트 에 넣 으 면 안 됩 니 다.데이터 베 이 스 를 설치 하 는 과정 에서 설치 프로그램 은 필드 를 int 형식 으로 바 꾸 고 외부 키 제약 을 추가 하려 고 시도 합 니 다.데이터 베이스 에 데이터 가 있 으 면 int 로 전환 하 는 데 실패 하거나 외부 키 제약 이 성립 되 지 않 습 니 다.
이 를 위해,우 리 는 Pre-script 에서 이 데 이 터 를 먼저 Terminal 표 에서 찾 아 업데이트 할 수 있 습 니 다.

BEGIN TRANSACTION
BEGIN TRY
 
IF EXISTS(select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Rating' and COLUMN_NAME = 'TerminalId' and DATA_TYPE = 'varchar')
BEGIN
 
    DECLARE @defaultTerminalId NVARCHAR(64) = (SELECT TOP 1 TerminalId FROM TMS.Terminal ORDER BY TerminalId ASC)
 
    UPDATE r
    SET r.TerminalId = ISNULL(t.TerminalId, @defaultTerminalId)
    FROM TMS.Rating r
    LEFT JOIN TMS.Terminal t ON r.TerminalId = t.NAME
 
END
    COMMIT TRANSACTION
END TRY
 
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK
END CATCH
 
GO
처음에 우 리 는 여러 가지 상황 을 고려 해 야 한다.만약 에 오래된 버 전에 서 업그레이드 된다 면 TerminalId 필드 의 유형 은 바로 varchar 이 고 이때 전환 이 필요 하 다.만약 그렇지 않다 면(예 를 들 어 새로 설치 하 는 것;또는 이전 버 전이 int 로 바 뀌 었 거나,다음 버 전이 실 행 될 때 이 Pre-script 은 실 행 될 것 이 므 로,이러한 상황 도 고려 해 야 합 니 다).
스 크 립 트 에서 검색 한 Terminal 표 의 TerminalId 를 Rating 표 에 직접 업데이트 합 니 다.찾 을 수 없 는 기본 값 으로 대체 합 니 다(int 는 varchar 로 변환 할 수 있 습 니 다.너비 가 충분 하 다 면;이 열 은 NULL 값 으로 도 사용 할 수 있 습 니 다).이렇게 하면 이 Pre-script 를 실행 한 후에 목표 값 이 되 고 나머지 열의 유형 전환 과 외부 키 제약 은 Red Gate 에 맡 기 면 됩 니 다.
UPDATE 문구 도 다른 표 에 가입 할 수 있다 는 점 이 재 미 있 습 니 다.이 문 구 를 배 워 보 세 요.
 3.어떤 시계 가 삭제 되 었 다
시계 한 장 이 필요 없다 면 레 드 게 이 트 는 직접 지 워 버 릴 것 이다.그러나 이 데이터 가 더 필요 하 다 면(예 를 들 어 다른 시스템 에 저장 되 었 다)Pre-script 으로 이 데 이 터 를 다른 곳 에 저장 해 야 합 니 다.그렇지 않 으 면 설치 가 끝 난 후에 Post-script 이 실행 되 기 전에 표 와 데이터 가 없습니다.
예 를 들 어 우 리 는 UserCard 표를 가지 고 있 습 니 다.새 버 전에 서 이 데 이 터 는 다른 시스템 에서 책임 을 집 니 다.이 를 위해 우 리 는 이 데 이 터 를 다른 시스템 으로 옮 겨 야 합 니 다.
Red Gate 가 업 그 레이 드 된 Schema 형식 을 지정 할 수 있 습 니 다.예 를 들 어 TMS 의 모든 표 만 사용 하고 다른 schema 의 표 에 대해 서 는 무시 할 수 있 습 니 다.이 점 을 이용 하여 Pre-script 에서 이 데 이 터 를 dbo 아래로 옮 길 수 있 습 니 다.

-- Backup UserCard data, so that we could transfer them to SBDB when installing TMS
 
BEGIN TRANSACTION
BEGIN TRY
 
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TempUserCard' AND TABLE_SCHEMA = 'dbo')
    DROP TABLE [dbo].[TempUserCard]
 
CREATE TABLE [dbo].[TempUserCard] (UserCardId BIGINT NOT NULL, UserId BIGINT NOT NULL, CardInfo NVARCHAR(256) NOT NULL)
 
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'UserCard' AND TABLE_SCHEMA = 'TMS')
BEGIN
 
    INSERT INTO [dbo].[TempUserCard]
        SELECT UserCardId, UserId, CardInfo FROM [TMS].[UserCard]
 
END
 
COMMIT TRANSACTION
END TRY
 
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK
END CATCH
 
GO
이렇게 해서 데이터 베 이 스 를 설치 한 후에 데 이 터 는 dbo.TempUserCard 표 에 있 습 니 다.이 때 다른 구성 요소 의 설치 프로그램 이나 Post-script,또는 다른 시스템 에서 이 시 계 를 옮 길 수 있 습 니 다.
이런 디자인 을 사용 하면 대부분의 상황 에 대응 할 수 있 을 것 이다.물론 우 리 는 데이터 뱅 크 의 구 조 를 디자인 할 때 데이터 시트 의 구 조 를 자주 수정 하여 Pre-script 와 Post-script 가 매우 많 고 복잡 하지 않도록 주도면밀 하 게 고려 해 야 한다.일부 script 이 사용 되 지 않 는 것 을 확인 한 경우 에 도 삭제 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기