El incremento de identidad de la columna de SQL Server 2012 salta de 6 a 1000+ en la séptima entrada [duplicado]
Tengo un escenario extraño en el que la columna int de identidad automática en mi base de datos de SQL Server 2012 no se incrementa correctamente.
Digamos que tengo una tabla que usa una identidad automática int como clave principal y esporádicamente omite incrementos, por ejemplo:
1, 2, 3, 4, 5, 1004, 1005
Esto sucede en un número aleatorio de tablas en momentos muy aleatorios, no se puede replicar para encontrar tendencias.
¿Cómo está pasando esto? ¿Hay alguna manera de detenerlo?
Todo esto es perfectamente normal. Microsoft agregó sequences
en SQL Server 2012, finalmente, podría agregar y cambiar la forma en que se generan las claves de identidad. Eche un vistazo aquí para obtener alguna explicación.
Si desea tener el comportamiento anterior, puede:
- utilice el indicador de seguimiento 272: esto provocará que se genere un registro para cada valor de identidad generado. El rendimiento de la generación de identidades puede verse afectado al activar este indicador de seguimiento.
- use un generador de secuencia con la configuración SIN CACHE ( http://msdn.microsoft.com/en-us/library/ff878091.aspx )
Tuve el mismo problema, encontré el siguiente informe de error en SQL Server 2012. Si aún es relevante, consulte las condiciones que causan el problema; también existen algunas soluciones (aunque no lo intenté). La conmutación por error o el reinicio dan como resultado el restablecimiento de la identidad
Si bien el indicador de seguimiento 272 puede funcionar para muchos, definitivamente no funcionará para instalaciones alojadas de Sql Server Express. Entonces, creé una tabla de identidad y la uso a través de un disparador EN LUGAR DE. Espero que esto ayude a alguien más y/o les brinde a otros la oportunidad de mejorar mi solución. La última línea permite devolver la última columna de identidad agregada. Como normalmente uso esto para agregar una sola fila, esto funciona para devolver la identidad de una sola fila insertada.
La tabla de identidad:
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]
y el disparador de inserción:
-- 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