데이터베이스 패키지 및 업그레이드 패키지 스 크 립 트 도구 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 이 사용 되 지 않 는 것 을 확인 한 경우 에 도 삭제 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx websocket ip_해시 규칙프로젝트 를 다운로드 한 후 서로 다른 네트워크 에 각각 이 demo 프로젝트 를 배치 합 니 다. 프로젝트 에서 환경 변수 에 따라 시스템 변 수 를 설정 합 니 다. spring.profiles.active=de...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.