Come molti di voi sapranno, esiste un Database Console Command (DBCC)
che consente di controllare lo stato di una colonna identity ed
eventualmente di effettuare reseed della stessa.
la sintassi è quella definita nei BOL alla voce "
DBCC CHECKIDENT (Transact-SQL)":
DBCC CHECKIDENT
(
table_name
[ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
)
[ WITH NO_INFOMSGS ]
Scrivo questo post solo per dirvi di far caso alla postilla nelle osservazioni:
"
Il valore Identity corrente viene impostato come new_reseed_value.
Se dopo la creazione della tabella non è stata inserita alcuna riga o
se tutte le righe sono state rimosse mediante l'istruzione TRUNCATE
TABLE, per la prima riga inserita dopo l'esecuzione di DBCC CHECKIDENT
viene utilizzato il valore new_reseed_value come valore Identity. In caso contrario, per la successiva riga inserita viene utilizzato il valore new_reseed_value + il valore di incremento corrente."
Fate attenzione, perchè se per sbaglio fate reseed a 0 dopo una truncate table (o una create, anche se non è facile che succeda
) vi troverete un bello 0 come primo valore inserito. Non urlate "è un bug"
. Un semplice esempio:
USE tempdb;
GO
IF EXISTS (SELECT * FROM sys.objects WHERe object_id = object_id('dbo.Identita'))
DROP TABLE
dbo.Identita
GO
CREATE TABLE dbo.Identita
(
Id int IDENTITY(1, 1) NOT NULL PRIMARY KEY
, Valore varchar(10) NOT NULL
)
GO
INSERT INTO dbo.Identita (Valore) VALUES ('Ale')
GO
SELECT Operazione
= 'solo insert', Id FROM Identita
-- delete e
reseed
DELETE FROM dbo.Identita
DBCC CHECKIDENT('dbo.Identita', RESEED, 0)
INSERT INTO dbo.Identita (Valore) VALUES ('Ale')
GO
SELECT Operazione
= 'dopo delete
(new_reseed_value + 1)', Id FROM Identita
-- truncate e
reseed
TRUNCATE TABLE dbo.Identita
DBCC CHECKIDENT('dbo.Identita', RESEED, 0)
INSERT INTO dbo.Identita (Valore) VALUES ('Ale')
GO
SELECT Operazione
= 'dopo truncate
(new_reseed_value)', Id FROM Identita
Non dà alcun fastidio, però se in tabella l'identity è stato definito
come il solito IDENTITY(1,1) possono sorgere incongruenze. Usate la
CHECKIDENT con cautela in ogni caso.
Ho
deciso di segnarmi questa cosa sul blog perchè non avevo mai fatto caso
a questo comportamento e in questi giorni ci si è riproposto proprio
dopo aver lanciato il reseed dopo una truncate senza volere.
Stay tuned!