ID 열 복제Replicate Identity Columns

열에 IDENTITY 속성을 할당하면 MicrosoftMicrosoft SQL ServerSQL Server 는 ID 열을 포함하는 테이블에 순차적 개수대로 삽입되는 새 행을 자동으로 생성합니다.When you assign an IDENTITY property to a column, MicrosoftMicrosoft SQL ServerSQL Server automatically generates sequential numbers for new rows inserted in the table containing the identity column. 자세한 내용은 IDENTITY(속성)(Transact-SQL)를 참조하세요.For more information, see IDENTITY (Property) (Transact-SQL). ID 열은 기본 키의 일부분으로 포함될 수 있으므로 ID 열에 중복 값을 사용하지 않아야 합니다.Because identity columns might be included as a part of the primary key, it is important to avoid duplicate values in the identity columns. 둘 이상의 노드에서 업데이트된 ID 열을 복제 토폴로지에서 사용하려면 복제 토폴로지의 각 노드가 다른 범위의 ID 값을 사용해야 중복이 발생하지 않습니다.To use identity columns in a replication topology that has updates at more than one node, each node in the replication topology must use a different range of identity values, so that duplicates do not occur.

예를 들어 게시자에 1-100 범위, 구독자 A에 101-200 범위, 그리고 구독자 B에 201-300 범위를 할당할 수 있습니다.For example, the Publisher could be assigned the range 1-100, Subscriber A the range 101-200, and Subscriber B the range 201-300. 예를 들어 게시자에 행이 삽입되고 ID 값이 65라면 이 값이 각 구독자에 복제됩니다.If a row is inserted at the Publisher and the identity value is, for example, 65, that value is replicated to each Subscriber. 복제가 각 구독자에 데이터를 삽입할 때 구독자 테이블의 ID 열 값을 증가시키지는 않습니다. 대신 리터럴 값 65가 삽입됩니다.When replication inserts data at each Subscriber, it does not increment the identity column value in the Subscriber table; instead, the literal value 65 is inserted. 복제 에이전트 삽입이 아닌 사용자 삽입만 ID 열 값을 증가시킵니다.Only user inserts, but not replication agent inserts cause the identity column value to be incremented.

복제는 모든 게시 및 구독 유형에서 ID 열을 처리하므로 사용자가 열을 수동으로 관리하거나 복제를 통해 자동으로 관리되도록 할 수 있습니다.Replication handles identity columns across all publication and subscription types, allowing you to manage the columns manually or have replication manage them automatically.

참고

열이 구독자로 복제될 때 데이터가 일치하지 않을 수 있기 때문에 게시된 테이블에 ID 열을 추가할 수 없습니다.Adding an identity column to a published table is not supported, because it can result in non-convergence when the column is replicated to the Subscriber. 게시자의 ID 열 값은 영향을 받는 테이블 행이 실제로 저장된 순서에 따라 달라집니다.The values in the identity column at the Publisher depend on the order in which the rows for the affected table are physically stored. 구독자에서는 행이 다르게 저장될 수 있으므로 ID 열의 값이 같은 행에 대해 다를 수 있습니다.The rows might be stored differently at the Subscriber; therefore the value for the identity column can be different for the same rows.

ID 범위 관리 옵션 지정Specifying an Identity Range Management Option

복제는 3가지 ID 범위 관리 옵션을 제공합니다.Replication offers three identity range management options:

  • 자동.Automatic. 구독자에서 업데이트를 수행하는 병합 복제 및 트랜잭션 복제에 사용됩니다.Used for merge replication and transactional replication with updates at the Subscriber. 게시자 및 구독자에 대한 크기 범위를 지정하면 복제는 새 범위의 할당을 자동으로 관리합니다.Specify size ranges for the Publisher and Subscribers, and replication automatically manages the assignment of new ranges. 복제는 구독자의 ID 열에 NOT FOR REPLICATION 옵션을 설정하므로 사용자 삽입만 구독자에서 값을 증가시킬 수 있습니다.Replication sets the NOT FOR REPLICATION option on the identity column at the Subscriber, so that only user inserts cause the value to be incremented at the Subscriber.

    참고

    구독자는 게시자와 동기화해야 새 범위를 받을 수 있습니다.Subscribers must synchronize with the Publisher to receive new ranges. 구독자에게는 ID 범위가 자동으로 할당되므로 구독자가 계속해서 새 범위를 요청할 경우 전체 ID 범위 공급이 중단될 수 있습니다.Because Subscribers are assigned identity ranges automatically, it is possible for any Subscriber to exhaust the entire supply of identity ranges if it repeatedly requests new ranges.

  • 수동.Manual. 구독자에서 업데이트를 수행하지 않는 스냅숏 복제와 트랜잭션 복제 또는 피어 투 피어 트랜잭션 복제에 사용되거나 응용 프로그램이 ID 범위를 프로그래밍 방식으로 제어해야 할 경우 사용됩니다.Used for snapshot and transactional replication without updates at the Subscriber, peer-to-peer transactional replication, or if your application must control identity ranges programmatically. 수동 관리를 지정하면 범위가 게시자 및 각 구독자에 할당되었는지 확인하고 초기 범위가 사용된 경우에는 새 범위가 할당되었는지 확인해야 합니다.If you specify manual management, you must ensure that ranges are assigned to the Publisher and each Subscriber and that new ranges are assigned if the initial ranges are used. 복제는 구독자의 ID 열에 NOT FOR REPLICATION 옵션을 설정합니다.Replication sets the NOT FOR REPLICATION option on the identity column at the Subscriber.

  • 없음None. 이 옵션은 SQL ServerSQL Server 이전 버전과의 호환성을 위해서만 권장되며 트랜잭션 게시용 저장 프로시저 인터페이스에서만 사용할 수 있습니다.This option is recommended only for backwards compatibility with earlier versions of SQL ServerSQL Server and is available only from the stored procedure interface for transactional publications.

    ID 범위 관리 옵션을 지정하려면 ID 열 관리를 참조하세요.To specify an identity range management option, see Manage Identity Columns.

ID 범위 할당Assigning Identity Ranges

병합 복제 및 트랜잭션 복제는 여러 가지 방법으로 범위를 할당합니다. 이 섹션에서는 3가지 방법을 설명합니다.Merge replication and transactional replication use different methods for assigning ranges; these methods are described in this section.

ID 열을 복제하는 경우에는 두 가지 범위, 즉 게시자와 구독자에 할당된 범위와 열의 데이터 형식 범위를 고려해야 합니다.There are two types of ranges to take into account when replicating identity columns: the ranges assigned to the Publisher and Subscribers, and the range of the data type in the column. 다음 표에서는 일반적으로 ID 열에 사용되는 데이터 형식에 사용할 수 있는 범위를 보여 줍니다.The following table shows the ranges available for the data types typically used in identity columns. 범위는 토폴로지의 모든 노드에서 사용됩니다.The range is used across all nodes in a topology. 예를 들어 1로 시작하여 1씩 증가하는 smallint 를 사용할 경우 게시자 및 모든 구독자에 대한 최대 삽입 수는 32,767입니다.For example, if you use smallint starting at 1 with an increment of 1, the maximum number of inserts is 32,767 for the Publisher and all Subscribers. 실제 삽입 수는 사용된 값에 차이가 있는지 여부와 임계값이 사용되는지 여부에 따라 달라집니다.The actual number of inserts depends on whether there are gaps in the values used and whether a threshold value is used. 임계값에 대한 자세한 내용은 이 항목의 뒷부분에 나올 "병합 복제" 및 "지연 업데이트 구독이 있는 트랜잭션 복제" 섹션을 참조하십시오.For more information about thresholds, see the following sections "Merge Replication" and "Transactional Replication with Queued Updating Subscriptions".

db_owner 고정 데이터베이스 역할의 멤버가 삽입을 수행했으면 게시자가 삽입 후 ID 범위를 모두 사용한 경우 구독자가 자동으로 새 범위를 할당할 수 있습니다.If the Publisher exhausts its identity range after an insert, it can automatically assign a new range if the insert was performed by a member of the db_owner fixed database role. 해당 역할의 사용자가 아닌 사용자가 삽입을 수행했으면 로그 판독기 에이전트, 병합 에이전트 또는 db_owner 역할의 멤버인 사용자가 sp_adjustpublisheridentityrange(Transact-SQL)를 실행해야 합니다.If the insert was performed by a user not in that role, the Log Reader Agent, Merge Agent, or a user who is a member of the db_owner role must run sp_adjustpublisheridentityrange (Transact-SQL). 트랜잭션 게시의 경우 새 범위를 자동으로 할당하려면 로그 판독기 에이전트가 실행되고 있어야 합니다. 기본적으로 에이전트는 계속 실행됩니다.For transactional publications, the Log Reader Agent must be running to automatically allocate a new range (the default is for the agent to run continuously).

경고

큰 일괄 처리 동안 복제 트리거 삽입은 삽입의 각 행에 대해 한 번만 발생합니다.During a large batch insert the replication trigger is fired only once, not for each row of the insert. ID 범위가 큰 삽입 시 사용되는 경우 INSERT INTO 문과 같은 insert 문이 실패할 수 있습니다.This can lead to a failure of the insert statement if an identity range is exhausted during an large insert, such as an INSERT INTO statement.

데이터 형식Data type 범위Range
tinyinttinyint 자동 관리에서 지원되지 않음Not supported for automatic management
smallintsmallint -2^15(-32,768) ~ 2^15-1(32,767)-2^15 (-32,768) to 2^15-1 (32,767)
intint -2^31(-2,147,483,648) ~ 2^31-1(2,147,483,647)-2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)
bigintbigint -2^63(-9,223,372,036,854,775,808) ~ 2^63-1(9,223,372,036,854,775,807)-2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)
decimalnumericdecimal and numeric -10^38+1 ~ 10^38-1-10^38+1 through 10^38-1
참고

여러 테이블에서 사용할 수 있거나 테이블을 참조하지 않고 응용 프로그램에서 호출할 수 있는 자동으로 증가하는 번호를 만들려면 시퀀스 번호를 참조하세요.To create an automatically incrementing number that can be used in multiple tables or that can be called from applications without referencing any table, see Sequence Numbers.

병합 복제Merge Replication

ID 범위는 게시자에 의해 관리되고 병합 에이전트에 의해 구독자로 전파됩니다. 재게시 계층에서는 범위가 루트 게시자와 재게시자에 의해 관리됩니다.Identity ranges are managed by the Publisher and propagated to Subscribers by the Merge Agent (in a republishing hierarchy, ranges are managed by the root Publisher and the republishers). ID 값은 게시자의 풀에서 할당됩니다.The identity values are assigned from a pool at the Publisher. 새 게시 마법사 또는 sp_addmergearticle(Transact-SQL)을 사용하여 ID 열이 있는 아티클을 게시에 추가할 경우 다음에 대한 값을 지정합니다.When you add an article with an identity column to a publication in the New Publication Wizard or by using sp_addmergearticle (Transact-SQL), you specify values for:

  • @identity_range 매개 변수 - 구독 유형이 클라이언트 구독인 게시자와 구독자 모두에 초기에 할당되는 ID 범위 크기를 제어합니다.The @identity_range parameter, which controls the identity range size initially allocated both to the Publisher and to Subscribers with client subscriptions.

    참고

    이전 버전의 SQL ServerSQL Server를 실행하는 구독자의 경우 @pub_identity_range 매개 변수가 아닌 이 매개 변수가 재게시 구독자의 ID 범위 크기를 제어합니다.For Subscribers running previous versions of SQL ServerSQL Server, this parameter (rather than the @pub_identity_range parameter) also controls the identity range size at republishing Subscribers.

  • @pub_identity_range 매개 변수 - 구독 유형이 서버 구독인 구독자에 할당된 재게시 작업을 위한 ID 범위 크기를 제어합니다. 이는 데이터를 재게시하는 데 필요합니다.The @pub_identity_range parameter, which controls the identity range size for republishing allocated to Subscribers with server subscriptions (required for republishing data). 구독 유형이 서버 구독인 모든 구독자는 실제로 데이터를 재게시하지 않더라도 재게시 작업을 위한 범위를 받습니다.All Subscribers with server subscriptions receive a range for republishing, even if they don't actually republish data.

  • @threshold 매개 변수 - SQL Server CompactSQL Server Compact 또는 이전 버전의 SQL ServerSQL Server에 대한 구독에 새 ID 범위가 필요한 시기를 결정하는 데 사용됩니다.The @threshold parameter, which is used to determine when a new range of identities is required for a subscription to SQL Server CompactSQL Server Compact or a previous version of SQL ServerSQL Server.

    예를 들어 @identity_range 에 대해 10000을 지정하고 @pub_identity_range를 참조하세요.For example, you could specify 10000 for @identity_range and 500000 for @pub_identity_range. SQL Server 2005SQL Server 2005 이상 버전을 실행하는 게시자 및 모든 구독자(구독 유형이 서버 구독인 구독자 포함)에게 기본 범위 10000이 할당됩니다.The Publisher and all Subscribers running SQL Server 2005SQL Server 2005 or a later version, including the Subscriber with the server subscription, are assigned a primary range of 10000. 또한 구독 유형이 서버 구독인 구독자에는 기본 범위 500000이 할당되어 재게시 구독자와 동기화하는 구독자가 이 범위를 사용할 수 있습니다. 재게시 구독자에서 게시의 아티클에 대해 @identity_range, @pub_identity_range@threshold 를 지정해야 합니다The Subscriber with the server subscription is also assigned a primary range of 500000, which can be used by Subscribers that synchronize with the republishing Subscriber (you must also specify @identity_range, @pub_identity_range, and @threshold for the articles in the publication at the republishing Subscriber).

    SQL Server 2005SQL Server 2005 이상을 실행하는 각 구독자는 보조 ID 범위도 받습니다.Each Subscriber running SQL Server 2005SQL Server 2005 or a later version also receives a secondary identity range. 보조 범위의 크기는 주 범위의 크기와 같습니다. 주 범위를 모두 사용하면 보조 범위가 사용되고 병합 에이전트가 구독자에 새 범위를 할당합니다.The secondary range is equal in size to the primary range; when the primary range is exhausted, the secondary range is used, and the Merge Agent assigns a new range to the Subscriber. 새 범위는 보조 범위가 되고 구독자가 ID 값을 사용하는 한 프로세스는 계속 진행됩니다.The new range becomes the secondary range, and the process continues as the Subscriber uses identity values.

지연 업데이트 구독이 있는 트랜잭션 복제Transactional Replication with Queued Updating Subscriptions

ID 범위는 배포자에 의해 관리되고 배포 에이전트에 의해 구독자로 전파됩니다.Identity ranges are managed by the Distributor and propagated to Subscribers by the Distribution Agent. ID 값은 배포자의 풀에서 할당됩니다.The identity values are assigned from a pool at the Distributor. 풀 크기는 데이터 형식의 크기와 ID 열에 사용되는 증가값을 기반으로 합니다.The pool size is based on the size of the data type and the increment used for the identity column. 새 게시 마법사 또는 sp_addarticle(Transact-SQL)을 사용하여 ID 열이 있는 아티클을 게시에 추가할 경우 다음에 대한 값을 지정합니다.When you add an article with an identity column to a publication in the New Publication Wizard or by using sp_addarticle (Transact-SQL), you specify values for:

  • @identity_range 매개 변수 - 모든 구독자에 초기에 할당되는 ID 범위 크기를 제어합니다.The @identity_range parameter, which controls the identity range size initially allocated to all Subscribers.

  • @pub_identity_range 매개 변수 - 게시자에 할당되는 ID 범위 크기를 제어합니다.The @pub_identity_range parameter, which controls the identity range size allocated to the Publisher.

  • @threshold 매개 변수 - 구독에 새 ID 범위가 필요한 시기를 결정하는 데 사용됩니다.The @threshold parameter, which is used to determine when a new range of identities is required for a subscription.

    예를 들어 @pub_identity_range에 대해 10000을, @identity_range 에 대해 1000(구독자에서의 업데이트 수가 적다고 가정)을, 그리고 @threshold를 참조하세요.For example, you could specify 10000 for @pub_identity_range, 1000 for @identity_range (assuming fewer updates at the Subscriber), and 80 percent for @threshold. 구독자에서 800(1000의 80%)이 삽입되면 구독자에 새 범위가 할당됩니다.After 800 inserts at a Subscriber (80 percent of 1000), a Subscriber is assigned a new range. 게시자에서 8000이 삽입되면 게시자에 새 범위가 할당됩니다.After 8000 inserts at the Publisher, the Publisher is assigned a new range. 새 범위를 지정하면 테이블의 ID 범위 값에 간격이 발생합니다.When a new range is assigned, there will be a gap in the identity range values in the table. 더 높은 임계값을 지정하면 이러한 간격이 줄어들지만 시스템의 내결함성이 저하됩니다. 어떤 이유로든 배포 에이전트를 실행할 수 없으면 구독자에서 ID가 보다 빠른 속도로 줄어들 수 있습니다.Specifying a higher threshold results in smaller gaps, but the system is less fault-tolerant: if the Distribution Agent cannot run for some reason, a Subscriber could more easily run out of identities.

ID 범위 수동 관리를 위한 범위 할당Assigning ranges for manual identity range management

ID 범위 수동 관리를 지정할 경우 게시자와 각 구독자가 서로 다른 ID 범위를 사용하고 있는지 확인해야 합니다.If you specify manual identity range management, you must ensure that the Publisher and each Subscriber use different identity ranges. 예를 들어 게시자에 있는 테이블의 ID 열이 IDENTITY(1,1)로 정의되어 있다고 가정합니다. 이 ID 열은 1에서 시작하고 행이 삽입될 때마다 1씩 증가합니다.For example, consider a table at the Publisher with an identity column defined as IDENTITY(1,1): the identity column starts at 1 and is incremented by 1 each time a row is inserted. 게시자의 테이블에 5,000개의 행이 있고 응용 프로그램 수명 동안 테이블이 얼마간 커질 것으로 예상되는 경우 게시자는 1-10,000 범위를 사용할 수 있습니다.If the table at the Publisher has 5,000 rows, and you expect some growth in the table over the life of the application, the Publisher could use the range 1-10,000. 두 개의 구독자가 있는 경우 구독자 A는 10,001-20,000을 사용하고 구독자 B는 20,001-30,000을 사용할 수 있습니다.Given two Subscribers, Subscriber A could use 10,001–20,000, and Subscriber B could use 20,001-30,000.

스냅숏 또는 다른 방법으로 구독자가 초기화되면 DBCC CHECKIDENT를 실행하여 구독자에게 해당 ID 범위의 시작 지점을 할당합니다.After a Subscriber is initialized with a snapshot or through another means, execute DBCC CHECKIDENT to assign the Subscriber a starting point for its identity range. 예를 들어 구독자 A에서 DBCC CHECKIDENT('<TableName>','reseed',10001)를 실행하고For example, at Subscriber A, you would execute DBCC CHECKIDENT('<TableName>','reseed',10001). 구독자 B에서 CHECKIDENT('<TableName>','reseed',20001)를 실행합니다.At Subscriber B, you would execute CHECKIDENT('<TableName>','reseed',20001).

게시자 또는 구독자에 새 범위를 할당하려면 DBCC CHECKIDENT를 실행하고 새 값을 지정하여 테이블의 초기값을 다시 설정합니다.To assign new ranges to the Publisher or Subscribers, execute DBCC CHECKIDENT and specify a new value to reseed the table. 새 범위를 할당해야 하는 시기를 결정하는 몇 가지 방법이 있습니다.You should have some way to determine when a new range must be assigned. 예를 들어 응용 프로그램에 노드가 범위를 거의 다 사용하는 시기를 감지하고 DBCC CHECKIDENT를 사용하여 새 범위를 할당하는 메커니즘이 있을 수 있습니다.For example, your application could have a mechanism that detects when a node is about to use up its range and assign a new range using DBCC CHECKIDENT. 또한 범위를 벗어나는 ID 값이 사용되는 경우 행을 추가할 수 없도록 하는 CHECK 제약 조건을 추가할 수 있습니다.You can also add a check constraint to ensure that a row cannot be added if it would cause an out of range identity value to be used.

데이터베이스 복원 후 ID 범위 처리Handling Identity Ranges after a Database Restore

ID 범위 자동 관리를 사용하는 경우 백업에서 구독자를 복원하면 구독자가 자동으로 새 ID 값 범위를 요청합니다.If you are using automatic identity range management, when a Subscriber is restored from a backup, it automatically requests a new range of identity values. 백업에서 게시자가 복원되는 경우에는 게시자에 적절한 범위가 할당되었는지 확인해야 합니다.If a Publisher is restored from a backup, you must ensure that the Publisher is assigned an appropriate range. 병합 복제의 경우 sp_restoremergeidentityrange(Transact-SQL)를 사용하여 새 범위를 할당합니다.For merge replication, assign a new range using sp_restoremergeidentityrange (Transact-SQL). 트랜잭션 복제의 경우 사용된 값 중 가장 높은 값을 확인한 후 새 범위의 시작 지점을 설정합니다.For transactional replication, determine the highest value that has been used and then set the starting point for new ranges. 게시 데이터베이스가 복원된 후 다음 절차를 따르십시오.Use the following procedure after the publication database has been restored:

  1. 모든 구독자에서 모든 작업을 중지합니다.Stop all activity on all Subscribers.

  2. ID 열을 포함하는 게시된 각 테이블의 경우에는 다음을 수행하십시오.For each published table that includes an identity column:

    1. 각 구독자의 구독 데이터베이스에서 IDENT_CURRENT('<TableName>')를 실행합니다.In the subscription database at each Subscriber, execute IDENT_CURRENT('<TableName>').

    2. 모든 구독자에서 발견된 값 중 가장 높은 값을 기록합니다.Record the highest value found across all Subscribers.

    3. 게시자의 게시 데이터베이스에서 DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>)를 실행합니다.In the publication database at the Publisher, execute DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>).

    4. 게시자의 게시 데이터베이스에서 sp_adjustpublisheridentityrange <PublicationName>, <TableName>를 실행합니다.In the publication database at the Publisher, execute sp_adjustpublisheridentityrange <PublicationName>, <TableName>.

    참고

    ID 열의 값이 증가값이 아닌 감소값으로 설정되면 발견된 값 중 가장 낮은 값을 기록하고 해당 값으로 초기값을 다시 설정합니다.If the value in the identity column is set to decrement rather than increment, record the lowest value found, and then reseed with that value.

관련 항목:See Also

BACKUP(Transact-SQL) BACKUP (Transact-SQL)
DBCC CHECKIDENT(Transact-SQL) DBCC CHECKIDENT (Transact-SQL)
IDENT_CURRENT(Transact-SQL) IDENT_CURRENT (Transact-SQL)
IDENTITY(속성)(Transact-SQL) IDENTITY (Property) (Transact-SQL)
sp_adjustpublisheridentityrange(Transact-SQL) sp_adjustpublisheridentityrange (Transact-SQL)