FK를 유지하면서 대상 테이블에 이미있는 데이터베이스 서버간에 데이터를 이동하는 것이 목표 인 다음 프로세스에서 현재 작업 중입니다.데이터 마이그레이션을 위해 T-SQL에서 깨끗한 ID 값 블록 예약
- 는 "루트"테이블에서 행 세트를 추출하고 그 아이의 모든 테이블 'FK 관련 데이터 N-수준의 깊이에 다른 데이터베이스에 존재할 수 관련 행과 함께 : 중복 ID 열 값으로 행 원본 데이터베이스 서버와 동일한 인스턴스.
- 추출 된 데이터 집합을 대상 데이터베이스 서버의 준비 테이블 집합에 배치합니다.
- 대상 테이블에 대한 ID 블록을 예약하고 관련된 모든 하위 스테이징 테이블을 업데이트하여 스테이징 테이블의 데이터를 다시 키십시오 (이 스테이징 테이블 각각은 소스/대상 테이블과 동일한 스키마를 가지며 "lNewIdentityID "열).
- 새로운 ID로 데이터를 올바른 순서로 대상 테이블에 삽입하십시오 (SET IDENTITY_INSERT 'desttable'ON이 분명히 사용됩니다).
이 프로세스 (# 3)의 블록 예약 부분에 어려움을 겪고 있습니다. 우리 시스템은 짧은 주간 유지 보수 창을 제외하고는 거의 24 시간 시스템입니다. 관리는 서버간에 데이터를 마이그레이션하기 위해 유지 관리 기간을 위해 매주 기다릴 필요가 없도록이 프로세스가 필요합니다. 즉, # 3에있는 동안 마이그레이션 프로세스와 경쟁하는 100 개의 삽입 트랜잭션이있을 수 있습니다. 아래는 신분을 확보하기위한 시도였습니다.하지만 "SET @newIdent ..."와 "DBCC CHECKIDENT ..."사이에 삽입 트랜잭션이 완료되고 마이그레이션 프로세스가 완료되지 않을까 걱정됩니다. 스테이징 데이터를 다시 키잉하는 데 사용할 수있는 알려진 범위의 ID 블록을 가지고 있어야합니다.
본질적으로 테이블을 잠그고, 현재 ID를 얻고, ID를 늘리고 테이블을 잠금 해제해야합니다. 나는 T-SQL에서 그렇게하는 법을 모르고 아이디어를 찾고 있습니다. 고맙습니다.
IF EXISTS (SELECT TOP 1 1 FROM sys.procedures WHERE [name]='DataMigration_ReserveBlock')
DROP PROC DataMigration_ReserveBlock
GO
CREATE PROC DataMigration_ReserveBlock (
@tableName varchar(100),
@blockSize int
)
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
DECLARE @newIdent bigint;
SET @newIdent = @blockSize + IDENT_CURRENT(@tableName);
DBCC CHECKIDENT (@tableName, RESEED, @newIdent);
SELECT @newIdent AS NewIdentity;
END
GO
DataMigration_ReserveBlock 'tblAddress', 1234