SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

RESEED di identity, attenzione alla postilla

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!

Categoria: Transact-SQL
mercoledì, 23 dic 2009 Ore. 23.45
Statistiche
  • Views Home Page: 585.170
  • Views Posts: 1.042.287
  • Views Gallerie: 609.547
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003