with type new jump create sql sql-server sql-server-2012 identity

type - sql server id identity



Aumento de identidad de columna de SQL Server 2012 saltando de 6 a 1000+ en la 7ma entrada (4)

Esta pregunta ya tiene una respuesta aquí:

Tengo un extraño escenario 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 auto int como clave principal, omitiendo esporádicamente incrementos, por ejemplo:

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

Esto sucede en un número aleatorio de tablas en momentos muy aleatorios, no puede replicarse para encontrar tendencias.

¿Cómo está sucediendo esto? ¿Hay alguna manera de detenerlo?


Obtuve el mismo problema, encontré el siguiente informe de error en SQL Server 2012 Si aún es relevante, vea las condiciones que causan el problema; también hay algunas soluciones (aunque no lo intenté). Failover o Restart Results en Reseed of Identity


Sé que mi respuesta podría llegar tarde a la fiesta. Pero lo he resuelto de otra manera al agregar un procedimiento almacenado de inicio en SQL Server 2012.

Cree un siguiente procedimiento almacenado en el maestro 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

A continuación, agréguelo a Start up utilizando la siguiente sintaxis.

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

Esta es una buena idea si tiene pocas tablas. pero si tiene que hacer muchas tablas, este método aún funciona, pero no es una buena idea.


Si bien el indicador de traza 272 puede funcionar para muchos, definitivamente no funcionará para las instalaciones hospedadas de Sql Server Express. Entonces, creé una tabla de identidad y la utilicé a través de un desencadenador INSTEAD OF. Espero que esto ayude a otra persona, y / o le dé 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 gatillo 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


Esto es completamente 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 here para alguna explicación.

Si quieres tener el comportamiento anterior, puedes:

  1. use trace flag 272 - esto causará que se genere un registro de registro para cada valor de identidad generado. El rendimiento de la generación de identidad puede verse afectado al activar esta marca de seguimiento.
  2. utilice un generador de secuencia con la configuración NO CACHE ( http://msdn.microsoft.com/en-us/library/ff878091.aspx )