복붙노트

[SQL] 신원 증가는 SQL Server 데이터베이스에 점프

SQL

신원 증가는 SQL Server 데이터베이스에 점프

SQL 서버 2012 데이터베이스 정체성 증가에 열 "ReceiptNo"내 테이블 요금 중 하나에서 갑자기 다음과 같은 두 가지에 따라 100 단위 대신 1로 점프를 시작했다.

해결법

  1. ==============================

    1.당신은 아마 여기에 문제 (뒤로 기계)를 발생한다.

    당신은 아마 여기에 문제 (뒤로 기계)를 발생한다.

    int로 열에 IDENTITY 값을 할당하고 서비스가 사용되지 않는 값을 "잃을"수 다시 시작할 때 SQL 서버 2012는 지금 1000의 캐시 크기를 사용합니다 (캐시 크기는 BIGINT / 숫자 10,000)입니다.

    (24)에 대한 데이터 입력 후 1207305. - - 다른 다시 시작 수행을 25 12 월과 SQL Server가 다음 범위를 예약 된 데이터에서 당신은 그것이 SQL Server가 값을 1206306을 예약 다시 시작할 때이 다음 (22) 12 월 데이터 입력 후 무슨 일이 있었처럼 보인다 보여 주었다 1207306-1208305 28에 대한 항목에 표시.

    당신이 특별한 주파수로 서비스를 다시 시작하지 않는 한 어떤 "손실"값은 최선의 정책이 그것에 대해 걱정되지 않도록 데이터 유형에 의해 허용 된 값의 범위에서 상당한 덴트을 할 가능성이 있습니다.

    이 어떤 이유로 진짜 문제가있는 경우 링크 된 연결 항목 스레드에서 해결 방법을 참조하십시오.

    당신은 알고 있어야하지 둘 다 이러한 해결 방법의 틈을 보장 없습니다. 그것은 단지 테이블에 삽입 직렬화가 가능 하듯이는 IDENTITY에 의해 보장 된 적이 없다. 당신은 끊김없는 열이 필요한 경우 중 하나 IDENTITY 또는 SEQUENCE는 다른 솔루션을 사용해야합니다

  2. ==============================

    2.이 문제는 SQL 서버를 다시 시작한 후에 발생합니다.

    이 문제는 SQL 서버를 다시 시작한 후에 발생합니다.

    이 솔루션은 다음과 같습니다

  3. ==============================

    3.SQL 서버에서 2017+는 ALTER 데이타베이스 범위 설정을 사용할 수 있습니다 :

    SQL 서버에서 2017+는 ALTER 데이타베이스 범위 설정을 사용할 수 있습니다 :

  4. ==============================

    4.내 대답은 파티에 늦을 수도 있습니다 알고있다. 하지만 난 SQL 서버 2012에서 저장 프로 시저까지 시작을 추가하여 다른 방법으로 해결했다.

    내 대답은 파티에 늦을 수도 있습니다 알고있다. 하지만 난 SQL 서버 2012에서 저장 프로 시저까지 시작을 추가하여 다른 방법으로 해결했다.

    마스터 DB에서 다음 저장 프로 시저를 만듭니다.

    USE [master]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[ResetTableNameIdentityAfterRestart]
    AS
    BEGIN
    
    begin TRAN
        declare @id int = 0
        SELECT @id =  MAX(id) FROM [DatabaseName].dbo.[TableName]
        --print @id
        DBCC CHECKIDENT ('[DatabaseName].dbo.[TableName]', reseed, @id)
    Commit
    
    END
    

    그런 다음 구문을 사용하여 최대 시작에 추가합니다.

    EXEC sp_procoption 'ResetOrderIdentityAfterRestart', 'startup', 'on';
    

    이것은 당신이 몇 테이블이있는 경우 좋은 생각이다. 당신이 많은 테이블을 위해 무엇을해야하는 경우 그러나,이 방법은 여전히 ​​좋은 아이디어를 작동하지만.

  5. ==============================

    5.이것은 여전히 ​​크기에 관계없이 많은 개발자와 응용 프로그램 사이에서 매우 일반적인 문제입니다.

    이것은 여전히 ​​크기에 관계없이 많은 개발자와 응용 프로그램 사이에서 매우 일반적인 문제입니다.

    불행하게도 제안은 위의 모든 시나리오가 해결되지 않는, 즉 공유, 당신은 -t272 시작 매개 변수를 설정하는 호스트에 의존 할 수 호스팅.

    당신이 기본 키에 대해이 ID 열을 사용하는 테이블을 기존의 경우 또한, 그것은 그 열을 삭제하고 BS 시퀀스 해결 방법을 사용하는 새로운 것들을 재현하는 거대한 노력이다. 당신은 SQL에서 처음부터 새 테이블을 디자인하는 경우 시퀀스 해결 방법은 좋은 2012+

    당신은 SQL Server 2008R2에있는 경우 결론은 IT에 머물,이다. 진심으로, 거기에있어. Microsoft는 그들은 심지어는 SQL 서버 2016 년이 여전히 거대한 버그를 소개 인정까지 그들이 및 FIX IT를 소유 할 때까지, 우리는 업그레이드하지 않아야합니다.

    마이크로 소프트가 똑바로 주요 변경을 도입, 즉 그들이 작동하는 API를 부러 인해 시스템이 재시작 현재의 정체성을 잊어 버린 사실, 설계대로 더 이상 작동하는지. 캐시 또는 전혀 캐시,이 받아 들일 수없는, 그리고 브라이언의 이름으로 마이크로 소프트 개발자는 자신의 대신은과 "기능" "디자인"이라고 세계를 알 필요가있다. 물론, 캐싱 기능이지만, 다음의 정체성이 무엇을해야 트랙을 잃고, 기능이 아닙니다. 그것은 fricken 버그입니다!

    내 DB 년대가 공유 호스팅 서버에 있기 때문에 나는 또한, 내가 삭제하고 내 기본 키 열을 다시 아니에요, 내가 사용하는 해결 방법을 공유 할 것입니다, 그것은 거대한 피타 될 것이다.

    대신이 나의 부끄러운 해킹 (그러나 마이크로 소프트가 소개했다고이 POS 버그만큼 부끄러운되지 않음)입니다.

    당신의 삽입 명령하기 전에, 단지 각 삽입하기 전에 사용자의 신원을 다시 시드. 당신은 SQL Server 인스턴스를 통해 관리자 제어가없는 경우이 수정 만 그렇지 않으면 내가 서버를 다시 시작할 시드 제안 좋습니다.

    declare @newId int -- where int is the datatype of your PKey or Id column
    select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
    DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
    

    그냥 그 3 즉시 삽입하기 전에 선, 당신이 가서 잘되어야합니다. 정말 많은, 즉이 눈에 띄지 될 것으로 성능에 영향을주지 않습니다.

    행운을 빕니다.

  6. ==============================

    6.ID 값을 점프에 대한 여러 가지 이유가있다. 그들은 복제 ID 관리로 롤백 다시 삽입 이르기까지 다양합니다. 무엇 귀하의 경우 내가 시스템에 약간의 시간을 소비하지 않고 말할 수없는이 원인입니다.

    ID 값을 점프에 대한 여러 가지 이유가있다. 그들은 복제 ID 관리로 롤백 다시 삽입 이르기까지 다양합니다. 무엇 귀하의 경우 내가 시스템에 약간의 시간을 소비하지 않고 말할 수없는이 원인입니다.

    당신은 어떠한 경우에도 당신이 contiguos 할 수있는 ID 열을 가정 할 수 있다는 점을 알고 있어야합니다. 차이가 발생할 수 있습니다 너무 많은 것들이 있습니다.

    당신은 여기에 대해 좀 더 정보를 찾을 수 있습니다 : http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/

  7. from https://stackoverflow.com/questions/14146148/identity-increment-is-jumping-in-sql-server-database by cc-by-sa and MIT license