Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Mappa

TimeStamp

Il tipo di dato TimeStamp (8 byte di archiviazione), viene utilizzato per generare numeri binari univoci all'interno di un database ed è particolarmente indicato per la gestione delle versioni (modifiche) delle righe di una tabella.
TimeStamp fa riferimento ad un contatore interno ad ogni database che viene incrementato automaticamente ad ogni operazione di inserimento o modifica eseguita su di una tabella che contiene una colonna il cui tipo è TimeStamp.
Per poter conoscere il valore corrente del TimeStamp di un database, possiamo utilizzare l'istruzione @@DBTS.
Nonostante possa trarre in inganno il fatto che anche TimeStamp sia a 8 byte proprio come DateTime, in realtà il valore riportato indica il tempo relativo all'interno del database e non il tempo effettivo, quello che possiamo ricavare ad esempio, dall'orologio di sistema.

USE tempdB
SELECT 
 cast(@@DBTS AS DATETIME) AS 'TimeStamp',
 getdate() as 'DateTime'
/* Output
TimeStamp                   DateTime
-----------------------     -----------------------
1900-01-01 00:00:06.677     2006-03-31 11:02:14.717
(1 row(s) affected)
*/

Ogni tabella può includere una sola colonna di tipo timestamp, ma nonostante la sua unicità, TimeStamp NON è indicato per essere utilizzato come chiave primaria; infatti ogni volta che si andrebbe a modificare una riga, automaticamente verrebbe variato anche il valore della colonna TimeStamp con conseguente aggiornamento dell'indice e perdita dei riferimenti sulle chiavi esterne che puntano al vecchio valore dell'indice.
E' possibile determinare in modo semplice se almeno uno dei valori di una riga sia cambiato, leggendo il valore della colonna TimeStamp della tabella (se presente): se il valore è differente da quello dell'ultima lettura certamente avremo apportato modifche alla riga.
Quando utilizziamo l'istruzione CREATE TABLE o ALTER TABLE non è necessario specificare il nome della colonna TimeStamp poichè il Database Engine di SQL Server 2005 genererà un nome uguale al tipo e cioè TimeStamp.

SET NOCOUNT ON
USE tempdb
GO
CREATE TABLE myTable(id int, TimeStamp)

--Inserisco dei valori
Insert Into myTable(id) values(1)
Insert Into myTable(id) values(2)
Insert Into myTable(id) values(3)

Select * From myTable

GO
Drop Table mytable

/* Output
id               TimeStamp
-----------   ------------------
1               0x0000000000000878
2               0x0000000000000879
3               0x000000000000087A
*/

Indici Full-Text
Un scenario dove viene utilizzato il campo TimeStamp è nella manutenzione degli indici full-text e più precisamente nella ricostruzione incrementale appoggiandosi, per l'appunto, su una colonna TimeStamp. In questo modo sarà possibile recuperare solo le righe modificate dall'ultima ricostruzione.

Rowversion
Esiste anche un sinonimo per TimeStamp ed è rowversion. Un consiglio che troviamo sul BOL è quello di utilizzare quest'ultimo nelle istruzioni DDL
A differenza di TimeStamp, quando utilizziamo l'istruzione CREATE TABLE o ALTER TABLE è necessario specificare il nome della colonna rowversion.

Nota
Nonostante TimeStamp generi valori univoci, è possibile forzare l'inserimento di dati duplicati in colonne timestamp semplicemente utilizzando l'istruzione SELECT INTO ed includendo nell'elenco SELECT una colonna di tipo TimeStamp.
Inutile dire che è sconsigliato utilizzare questo sistema.
Categoria: SQL Server
venerdì, 31 mar 2006 Ore. 12.09
Statistiche
  • Views Home Page: 111.443
  • Views Posts: 567.759
  • Views Gallerie: 116.984
  • n° Posts: 227
  • n° Commenti: 222
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003