복붙노트

[SQL] 7 항목에 1000 6에서 SQL 서버 2012 열 신원 증가 점프 [중복]

SQL

7 항목에 1000 6에서 SQL 서버 2012 열 신원 증가 점프 [중복]

내 SQL 서버 2012 데이터베이스에서 자동 식별 INT 열이 제대로 증가하지 않는 이상한 시나리오가 있습니다.

내가 예를 들어, 산발적으로 단위를 건너 뛰는 기본 키를 int 자동 ID를 사용하는 테이블을 가지고 말 :

1, 2, 3, 4, 5, 1004, 1005

이것은 매우 임의의 시간에 테이블의 임의의 숫자에 무슨 일이 일어나고, 어떤 경향을 찾아 그것을 복제 할 수 없습니다.

어떻게 이런 일이 일어나고? 그것을 중지 할 수있는 방법이 있나요?

해결법

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

    1.이 모두 완벽하게 정상입니다. 마이크로 소프트는, 마지막으로, 내가 추가 할 수 있습니다 SQL 서버 2012에 시퀀스를 추가 및 ID 키가 생성되는 방법을 변경했습니다. 약간의 설명이 여기를 보라.

    이 모두 완벽하게 정상입니다. 마이크로 소프트는, 마지막으로, 내가 추가 할 수 있습니다 SQL 서버 2012에 시퀀스를 추가 및 ID 키가 생성되는 방법을 변경했습니다. 약간의 설명이 여기를 보라.

    당신이 이전 동작을 원한다면, 당신은 할 수 있습니다 :

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

    2.동일한 문제가있어, SQL 서버 2012에서 다음과 같은 버그 리포트를 발견 몇 가지 해결 방법이 거기뿐만 아니라 (하지만 노력하지 않았어요) - 문제 원인 것을 관련 참조 조건은 여전히합니다. 신원의 시드의 장애 조치 또는 다시 시작 결과

    동일한 문제가있어, SQL 서버 2012에서 다음과 같은 버그 리포트를 발견 몇 가지 해결 방법이 거기뿐만 아니라 (하지만 노력하지 않았어요) - 문제 원인 것을 관련 참조 조건은 여전히합니다. 신원의 시드의 장애 조치 또는 다시 시작 결과

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

    3.추적 플래그 (272)는 많은 일을 할 수 있지만, 그것은 확실히 호스팅 SQL Server Express를 설치 작동하지 않습니다. 그래서, 나는 정체성 테이블을 생성, 대신 OF 트리거를 사용합니다. 나는이 다른 사람을 도움이 희망, 및 / 또는 다른 사람에게 내 솔루션을 향상시킬 수있는 기회를 제공하고있다. 마지막 줄이 추가 된 마지막 ID 열을 반환 허용한다. 나는 일반적으로 단일 행을 추가하려면이 옵션을 사용하기 때문에,이 작품은 하나의 삽입 된 행의 ID를 반환합니다.

    추적 플래그 (272)는 많은 일을 할 수 있지만, 그것은 확실히 호스팅 SQL Server Express를 설치 작동하지 않습니다. 그래서, 나는 정체성 테이블을 생성, 대신 OF 트리거를 사용합니다. 나는이 다른 사람을 도움이 희망, 및 / 또는 다른 사람에게 내 솔루션을 향상시킬 수있는 기회를 제공하고있다. 마지막 줄이 추가 된 마지막 ID 열을 반환 허용한다. 나는 일반적으로 단일 행을 추가하려면이 옵션을 사용하기 때문에,이 작품은 하나의 삽입 된 행의 ID를 반환합니다.

    신원 테이블 :

    CREATE TABLE [dbo].[tblsysIdentities](
    [intTableId] [int] NOT NULL,
    [intIdentityLast] [int] NOT NULL,
    [strTable] [varchar](100) NOT NULL,
    [tsConcurrency] [timestamp] NULL,
    CONSTRAINT [PK_tblsysIdentities] PRIMARY KEY CLUSTERED 
    (
        [intTableId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    

    그리고 삽입 트리거 :

    -- INSERT --
    IF OBJECT_ID ('dbo.trgtblsysTrackerMessagesIdentity', 'TR') IS NOT NULL
       DROP TRIGGER dbo.trgtblsysTrackerMessagesIdentity;
    GO
    CREATE TRIGGER trgtblsysTrackerMessagesIdentity
    ON dbo.tblsysTrackerMessages
    INSTEAD OF INSERT AS 
    BEGIN
        DECLARE @intTrackerMessageId INT
        DECLARE @intRowCount INT
    
        SET @intRowCount = (SELECT COUNT(*) FROM INSERTED)
    
        SET @intTrackerMessageId = (SELECT intIdentityLast FROM tblsysIdentities WHERE intTableId=1)
        UPDATE tblsysIdentities SET intIdentityLast = @intTrackerMessageId + @intRowCount WHERE intTableId=1
    
        INSERT INTO tblsysTrackerMessages( 
        [intTrackerMessageId],
        [intTrackerId],
        [strMessage],
        [intTrackerMessageTypeId],
        [datCreated],
        [strCreatedBy])
        SELECT @intTrackerMessageId + ROW_NUMBER() OVER (ORDER BY [datCreated]) AS [intTrackerMessageId], 
        [intTrackerId],
       [strMessage],
       [intTrackerMessageTypeId],
       [datCreated],
       [strCreatedBy] FROM INSERTED;
    
       SELECT TOP 1 @intTrackerMessageId + @intRowCount FROM INSERTED;
    END
    
  4. from https://stackoverflow.com/questions/14162648/sql-server-2012-column-identity-increment-jumping-from-6-to-1000-on-7th-entry by cc-by-sa and MIT license