열에 IDENTITY 속성을 할당하면 Microsoft SQL Server는 ID 열이 포함된 테이블에 삽입된 새 행에 대한 순차 번호를 자동으로 생성합니다. 자세한 내용은 IDENTITY(속성)(Transact-SQL)를 참조하세요. ID 열은 기본 키의 일부로 포함될 수 있으므로 ID 열에서 중복 값을 방지하는 것이 중요합니다. 둘 이상의 노드에서 업데이트가 있는 복제 토폴로지에서 ID 열을 사용하려면 복제 토폴로지의 각 노드에서 다른 범위의 ID 값을 사용해야 중복이 발생하지 않습니다.
예를 들어 게시자에 1-100 범위, 구독자 A 범위 101-200, 구독자 B에 201-300 범위가 할당될 수 있습니다. 게시자에 행이 삽입되고 ID 값(예: 65)이면 해당 값이 각 구독자에 복제됩니다. 복제에서 각 구독자에 데이터를 삽입하는 경우 구독자 테이블의 ID 열 값은 증가하지 않습니다. 대신 리터럴 값 65가 삽입됩니다. 복제 에이전트 삽입은 아니지만 사용자 삽입만 하면 ID 열 값이 증가합니다.
복제는 모든 게시 및 구독 유형에서 ID 열을 처리하므로 열을 수동으로 관리하거나 복제에서 자동으로 관리할 수 있습니다.
비고
게시된 테이블에 ID 열을 추가하는 것은 지원되지 않습니다. 열이 구독자에 복제될 때 수렴되지 않을 수 있기 때문입니다. 게시자의 ID 열에 있는 값은 영향을 받는 테이블의 행이 물리적으로 저장되는 순서에 따라 달라집니다. 행은 구독자에 다르게 저장될 수 있습니다. 따라서 ID 열의 값은 동일한 행에 대해 다를 수 있습니다.
ID 범위 관리 옵션 지정
복제는 세 가지 ID 범위 관리 옵션을 제공합니다.
자동. 구독자에서 업데이트를 사용하여 병합 복제 및 트랜잭션 복제에 사용됩니다. 게시자 및 구독자에 대한 크기 범위를 지정하고 복제는 새 범위의 할당을 자동으로 관리합니다. 복제는 구독자의 ID 열에서 NOT FOR REPLICATION 옵션을 설정하므로 사용자 삽입만 구독자에서 값이 증가합니다.
비고
구독자는 게시자와 동기화하여 새 범위를 수신해야 합니다. 구독자는 ID 범위가 자동으로 할당되므로 새 범위를 반복적으로 요청하는 경우 모든 구독자가 ID 범위의 전체 공급을 소진할 수 있습니다.
수동. 구독자, 피어 투 피어 트랜잭션 복제 또는 애플리케이션이 프로그래밍 방식으로 ID 범위를 제어해야 하는 경우 업데이트 없이 스냅샷 및 트랜잭션 복제에 사용됩니다. 수동 관리를 지정하는 경우 범위가 게시자 및 각 구독자에 할당되고 초기 범위가 사용되는 경우 새 범위가 할당되는지 확인해야 합니다. 복제는 구독자의 ID 열에서 NOT FOR REPLICATION 옵션을 설정합니다.
없음. 이 옵션은 이전 버전의 SQL Server와의 호환성을 위해서만 권장되며 트랜잭션 게시에 대한 저장 프로시저 인터페이스에서만 사용할 수 있습니다.
ID 범위 관리 옵션을 지정하려면 ID 열 관리를 참조하세요.
ID 범위 할당
병합 복제 및 트랜잭션 복제는 범위를 할당하는 데 다른 방법을 사용합니다. 이러한 메서드는 이 섹션에서 설명합니다.
ID 열을 복제할 때 고려해야 할 범위 유형에는 게시자 및 구독자에 할당된 범위와 열의 데이터 형식 범위가 있습니다. 다음 표에서는 ID 열에 일반적으로 사용되는 데이터 형식에 사용할 수 있는 범위를 보여 줍니다. 범위는 토폴로지의 모든 노드에서 사용됩니다. 예를 들어 1부터 시작하여 1씩 증분하는 경우 smallint 게시자 및 모든 구독자의 최대 삽입 수는 32,767개입니다. 실제 삽입 수는 사용된 값에 간격이 있는지 여부와 임계값이 사용되는지 여부에 따라 달라집니다. 임계값에 대한 자세한 내용은 다음 섹션 "병합 복제" 및 "지연 업데이트 구독을 사용한 트랜잭션 복제"를 참조하세요.
게시자가 삽입 후 ID 범위를 소진하는 경우 db_owner 고정 데이터베이스 역할의 멤버가 삽입을 수행한 경우 새 범위를 자동으로 할당할 수 있습니다. 해당 역할에 없는 사용자가 삽입을 수행한 경우 로그 판독기 에이전트, 병합 에이전트 또는 db_owner 역할의 멤버인 사용자가 sp_adjustpublisheridentityrange(Transact-SQL)를 실행해야 합니다. 트랜잭션 게시의 경우 로그 판독기 에이전트를 실행하여 새 범위를 자동으로 할당해야 합니다(기본값은 에이전트가 지속적으로 실행됨).
경고
대량 일괄 삽입 시 복제 트리거는 삽입되는 각 행마다가 아니라 단 한 번만 작동합니다. 이로 인해 INSERT INTO 문과 같은 큰 삽입 작업 중에 ID 범위가 소진되면 insert 문이 실패할 수 있습니다.
| 데이터 형식 | 범위 |
|---|---|
tinyint |
자동 관리에 지원되지 않음 |
smallint |
-2^15(-32,768)에서 2^15-1(32,767) |
int |
-2^31(-2,147,483,648) ~ 2^31-1(2,147,483,647) |
bigint |
-2^63 (-9,223,372,036,854,775,808) ~ 2^63-1 (9,223,372,036,854,775,807) |
decimal 및 numeric |
-10^38+1 ~ 10^38-1 |
비고
여러 테이블에서 사용할 수 있거나 테이블을 참조하지 않고 애플리케이션에서 호출할 수 있는 자동으로 증가하는 번호를 만들려면 시퀀스 번호를 참조하세요.
병합 복제
ID 범위는 게시자에 의해 관리되고 병합 에이전트에 의해 구독자에게 전파됩니다(재게시 계층 구조에서 범위는 루트 게시자 및 다시 게시자에 의해 관리됨). ID 값은 게시자의 풀에서 할당됩니다. 새 게시 마법사의 게시에 ID 열이 있는 아티클을 추가하거나 sp_addmergearticle(Transact-SQL)를 사용하여 다음의 값을 지정합니다.
@identity_range 매개 변수는 처음에 게시자와 클라이언트 구독이 있는 구독자에 할당된 ID 범위 크기를 제어합니다.
비고
이전 버전의 SQL Server를 실행하는 구독자의 경우 이 매개 변수( @pub_identity_range 매개 변수가 아닌)는 구독자 다시 게시 시 ID 범위 크기도 제어합니다.
서버 구독을 사용하여 구독자에 할당된 다시 게시의 ID 범위 크기를 제어하는 @pub_identity_range 매개 변수입니다(데이터 다시 게시에 필요). 서버 구독이 있는 모든 구독자는 실제로 데이터를 다시 게시하지 않더라도 다시 게시할 범위를 받습니다.
@THRESHOLD 매개 변수는 SQL Server Compact 또는 이전 버전의 SQL Server 구독에 새 ID 범위가 필요한 경우를 결정하는 데 사용됩니다.
예를 들어, @identity_range에 10000을 지정하고 @pub_identity_range에 500000을 지정할 수 있습니다. 서버 구독이 있는 구독자를 포함하여 SQL Server 2005 이상을 실행하는 게시자와 모든 구독자에는 기본 범위 10000이 할당됩니다. 서버 구독을 가지고 있는 구독자에게는 기본 범위인 500000이 할당됩니다. 이 범위는 재게시 구독자와 동기화하는 구독자들이 사용할 수 있습니다. 재게시 구독자의 게시물에 있는 아티클에 대해 @identity_range, @pub_identity_range, 및 @threshold를 지정해야 합니다.
SQL Server 2005 이상 버전을 실행하는 각 구독자도 보조 ID 범위를 받습니다. 보조 범위는 기본 범위와 크기가 같습니다. 기본 범위가 소진되면 보조 범위가 사용되고 병합 에이전트가 구독자에 새 범위를 할당합니다. 새 범위는 보조 범위가 되고 구독자가 ID 값을 사용할 때 프로세스가 계속됩니다.
지연 업데이트 구독을 사용한 트랜잭션 복제
ID 범위는 배포자에 의해 관리되고 배포 에이전트에 의해 구독자에게 전파됩니다. ID 값은 배포자의 풀에서 할당됩니다. 풀 크기는 데이터 형식의 크기와 ID 열에 사용되는 증분을 기반으로 합니다. 새 게시 마법사의 게시에 ID 열이 있는 아티클을 추가하거나 sp_addarticle(Transact-SQL)를 사용하여 다음의 값을 지정합니다.
모든 구독자에 처음 할당된 ID 범위 크기를 제어하는 @identity_range 매개 변수입니다.
게시자에 할당된 ID 범위 크기를 제어하는 @pub_identity_range 매개 변수입니다.
구독에 새 ID 범위가 필요한 시기를 결정하는 데 사용되는 @threshold 매개 변수입니다.
예를 들어 @pub_identity_range를 10000으로, @identity_range를 1000으로 지정할 수 있으며, 이는 구독자에서 업데이트가 적다는 것을 가정합니다. @threshold는 80%로 설정할 수 있습니다. 구독자에서 800개(1000개 중 80%)를 삽입하면 구독자에게 새 범위가 부여됩니다. 게시자에서 8,000개 삽입한 후 게시자에 새 범위가 할당됩니다. 새 범위가 할당되면 테이블의 ID 범위 값에 간격이 있습니다. 임계값을 더 높게 지정하면 간격이 작지만 시스템은 내결함성이 떨어집니다. 어떤 이유로 배포 에이전트를 실행할 수 없으면 구독자가 ID가 더 쉽게 부족해질 수 있습니다.
수동 ID 범위 관리를 위한 범위 할당
수동 ID 범위 관리를 지정하는 경우 게시자와 각 구독자가 서로 다른 ID 범위를 사용하는지 확인해야 합니다. 예를 들어, IDENTITY(1,1) 게시자의 테이블에 1에서 시작하고 행이 삽입될 때마다 1씩 증가하는 ID 열이 있다고 가정해 보세요. 게시자의 테이블에 5,000개의 행이 있고 애플리케이션 수명 동안 테이블의 증가가 예상되는 경우 게시자는 1-10,000 범위를 사용할 수 있습니다. 두 구독자가 있는 경우 구독자 A는 10,001-20,000을 사용할 수 있고 구독자 B는 20,001-30,000을 사용할 수 있습니다.
구독자가 스냅샷 또는 다른 수단을 통해 초기화되면 DBCC CHECKIDENT를 실행하여 구독자에게 ID 범위의 시작점을 할당합니다. 예를 들어 구독자 A에서 DBCC CHECKIDENT('<TableName>','reseed',10001)를 실행합니다. 구독자 B에서 CHECKIDENT('<TableName>','reseed',20001)을(를) 실행합니다.
게시자 또는 구독자에 새 범위를 할당하려면 DBCC CHECKIDENT를 실행하고 테이블을 다시 표시할 새 값을 지정합니다. 새 범위를 할당해야 하는 시기를 결정하는 방법이 있어야 합니다. 예를 들어 애플리케이션에는 노드가 범위를 사용하려고 할 때를 감지하고 DBCC CHECKIDENT를 사용하여 새 범위를 할당하는 메커니즘이 있을 수 있습니다. 범위를 벗어난 ID 값이 사용될 경우 행을 추가할 수 없도록 CHECK 제약 조건을 추가할 수도 있습니다.
데이터베이스 복원 후 ID 범위 처리
자동 ID 범위 관리를 사용하는 경우 구독자가 백업에서 복원되면 새 ID 값 범위를 자동으로 요청합니다. 게시자가 백업에서 복원된 경우 게시자에 적절한 범위가 할당되었는지 확인해야 합니다. 병합 복제의 경우 sp_restoremergeidentityrange(Transact-SQL)를 사용하여 새 범위를 할당합니다. 트랜잭션 복제의 경우 사용된 가장 높은 값을 확인한 다음 새 범위의 시작점을 설정합니다. 게시 데이터베이스가 복원된 후 다음 절차를 사용합니다.
모든 구독자의 모든 활동을 중지합니다.
ID 열을 포함하는 게시된 각 테이블에 대해 다음을 수행합니다.
IDENT_CURRENT('<TableName>')을 각 구독자의 구독 데이터베이스에서 실행합니다.모든 구독자에서 찾은 가장 높은 값을 기록합니다.
게시자의 발행 데이터베이스에서
DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>를 실행합니다).게시자의 게시 데이터베이스에서
sp_adjustpublisheridentityrange <PublicationName>, <TableName>를 실행합니다.
비고
ID 열의 값이 증가가 아닌 감소로 설정된 경우 찾은 가장 낮은 값을 기록한 다음 해당 값으로 다시 설정합니다.
또한 참조하십시오
BACKUP(Transact-SQL)
DBCC CHECKIDENT(Transact-SQL)
IDENT_CURRENT(Transact-SQL)
IDENTITY(속성)(Transact-SQL)
sp_adjustpublisheridentityrange(Transact-SQL)