Buenas tardes queridos lectores, el día de hoy veremos lo que llamaremos un "bug" en SQL SERVER que tiene que ver con la identidad, es decir un campo Identity que de la nada se incrementa en mil, y no sabemos porque, pues aquí tendrán la respuesta.
En ocasiones podemos apreciar que el campo Identity en SQL SERVER puede aumentar en 1000 (mil) posiciones en un campo int o 10000 (diez mil) en un campo bigint, esto se da a partir de la versión 2012 de SQL SERVER y esto es porque SQL SERVER reserva en cache un espacio de estas posiciones, por lo que, en caso de reinicio estos valores se desperdician.
Veamos el caso del error considerando el siguiente código::
create database identidad
go
USE
IDENTIDAD
GO
CREATE TABLE IDENTIDAD
(
ID INT PRIMARY KEY IDENTITY,
VALOR1 VARCHAR(MAX),
VALOR2 VARCHAR(MAX)
)
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('EMMANUEL', 'URIAS')
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR1', 'VALOR1')
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR2', 'VALOR2')
SELECT * FROM IDENTIDAD
Como vemos, primero generamos la base de datos, luego creamos una tabla que tiene el id y le asignamos la identidad a la llave primaria, posteriormente ingresamos algunos datos y listo, el resultado es el siguiente:
SHUTDOWN WITH NOWAIT
Shutdown with nowait |
Con esto, la instancia se apaga y tendremos que volver a habilitar el servicio
Iniciar servicio SQL SERVER |
Y nos volvemos a conectar al Manager Studio
Conectar al Management Studio |
Ahora vamos a ingresar nuevamente datos en nuestra base de datos, en la misma tabla que lo hicimos hace unos instantes
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR3', 'VALOR3')
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR4', 'VALOR4')
SELECT * FROM IDENTIDAD
1. Secuencias en SQL SERVER
CREATE SEQUENCE IDENTIDAD_ID AS int START WITH 1 NO CACHE
Para mayor información sobre secuencias puedes dar clic aqui Respuestas en Informática: Secuencias en SQL SERVER (respuestasit.com.mx)
Y a la tabla en el campo id le ponemos un constraint default apuntando hacia el valor que sigue de la secuencia
CREATE TABLE IDENTIDAD
(
ID INT PRIMARY KEY DEFAULT NEXT VALUE FOR IDENTIDAD_ID,
VALOR1 VARCHAR(MAX),
VALOR2 VARCHAR(MAX)
)
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('EMMANUEL', 'URIAS')
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR1', 'VALOR1')
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR2', 'VALOR2')
Ahora si apagamos la instancia e ingresamos los otros valores, ya no tendremos el problema.
SHUTDOWN WITH NOWAIT
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR3', 'VALOR3')
INSERT INTO IDENTIDAD (VALOR1, VALOR2) VALUES ('VALOR4', 'VALOR4')
SELECT * FROM IDENTIDAD
2. Arrancar el servicio de SQL SERVER con parámetro 272
3. Cambiar el alcance (scope) de la base de datos
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
Saludos
No hay comentarios.:
Publicar un comentario