programing

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

topblog 2023. 5. 28. 19:53
반응형

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

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

intauto 아이덴티티를 기본 키로 사용하는 테이블이 있다고 가정하면 다음과 같이 증분을 산발적으로 건너뜁니다.

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

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

이게 어떻게 된 일일까?그것을 멈추게 하는 방법이 있습니까?

이 모든 것은 완벽하게 정상입니다.마이크로소프트 추가sequences마지막으로 SQL Server 2012에서 ID 키가 생성되는 방식을 추가 및 변경할 수 있습니다.설명을 위해 여기를 보세요.

이전의 동작을 원할 경우 다음을 수행할 수 있습니다.

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

동일한 문제가 발생했습니다. SQL Server 2012에서 다음 버그 보고서가 발견되었습니다. 그래도 관련이 있다면 문제의 원인이 되는 조건을 참조하십시오. 몇 가지 해결 방법도 있습니다(그러나 시도하지는 않았습니다).페일오버 또는 다시 시작하면 ID 시드가 발생함

추적 플래그 272는 많은 경우에 사용할 수 있지만 호스팅된 SQL Server Express 설치에는 사용할 수 없습니다.그래서, 저는 ID 테이블을 만들었고, 이것을 트리거 대신에 사용했습니다.저는 이것이 다른 사람에게 도움이 되고 다른 사람에게 제 솔루션을 개선할 수 있는 기회를 주기를 바랍니다.마지막 행을 사용하면 마지막으로 추가된 ID 열을 반환할 수 있습니다.일반적으로 단일 행을 추가하는 데 사용하기 때문에 삽입된 단일 행의 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

반응형