IT

7 번째 항목에서 SQL Server 2012 열 ID 증가가 6에서 1000 이상으로 증가

lottoking 2020. 7. 12. 09:04
반응형

7 번째 항목에서 SQL Server 2012 열 ID 증가가 6에서 1000 이상으로 증가 [중복]


이 질문에는 이미 답변이 있습니다.

SQL Server 2012 데이터베이스의 자동 ID int 열이 제대로 증가하지 않는 이상한 시나리오가 있습니다.

int 자동 ID를 기본 키로 사용하여 테이블을 산발적으로 건너 뛰는 테이블이 가정 해.

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

이것은 매우 임의의 시간에 임의의 수의 테이블에서 발생하며 추세를 찾기 위해 복제 할 수 없습니다.

이런 일이 어떻게? 멈추게하는 방법이 있습니까?


이것은 모두 완벽하게 정상입니다. Microsoft sequences는 SQL Server 2012에 추가 기능을 추가하고 마지막으로 ID 키 생성 방식을 추가하고 있습니다. 가지고 오 파운더 여기에가지 설명은합니다.

오래된 행동을 다음과 같이 할 수 있습니다.

  1. 추적 플래그 272 사용-생성 된 각 ID 값에 대해 로그 레코드가 생성됩니다. 이 추적 플래그를 설정하면 ID 생성 성능에 영향을 줄 수 있습니다.
  2. 캐시 설정으로 시퀀스 생성기를 사용하십시오 ( http://msdn.microsoft.com/en-us/library/ff878091.aspx )

같은 문제가 발생했습니다. SQL Server 2012에서 다음 버그 보고서를 찾았습니다. 여전히 관련이있는 경우 문제를 해결해야합니다. 해결 방법도 있습니다. ID를 다시 시드하여 장애 조치 또는 다시 시작 결과


추적 플래그 272는 많은 경우 작동하지만 호스트 Sql Server Express 설치에서는 작동하지 않습니다. 따라서 ID 테이블을 통해 INSTEAD 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

참고 URL : https://stackoverflow.com/questions/14162648/sql-server-2012-column-identity-increment-jumping-from-6-to-1000-on-7th-entry

반응형