mercredi 1 avril 2009

Les data-types TimeStamp et RowVersion pour Sql Serveur

Définition de TimeStamp
Le type de donnée TimeStamp n'a absolument rien avoir avec le temps (pour stocker des informations relatives à la date et l'heure, utilisez plutôt le type DateTime).
Il s'agit d'un compteur a valeur unique géré par SQL Serveur lui-même.
TimeStamp est un compteur HexaDécimal de 8 bytes et il existe un compteur par DB.

Les champs TimeStamp ne doivent pas être formellement assignés, SQL Serveur s'occupe seul de mettre à jour ce champs lorsqu'un enregistrement est inséré (insert) ou mis-à-jour (update).
Puisque les champs TimeStamp sont automatiquement modifiés lors des updates, ces champs TimeStamp permettent facilement:
  • De suivre les modifications d'un enregistrement.
    Ex: Une signature électronique correspondant à un TimeStamp particulier d'un enregistrement.
  • De distinguer les différentes versions d'un même enregistrement.
    Ex: référencement d'une version particulière de d'un enregistrement dans une table d'audit (stockant toutes les versions du dit enregistrement).
Si SQL server génère la valeur du TimeStamp, cette valeur est assurée d'être unique dans la DB.
Il n'est pas possible d'assigner soi même une valeur arbitraire à ce champ.

Utiliser RowVersion au lieu de TimeStamp
Pour éviter toute ambiguité, il est préférable d'utiliser le type RowVersion.
Ce dernier fonctionne exactement comme TimeStamp (et utilise par ailleurs le même compteur).

Exemple pratique
CREATE TABLE sales2(
  RowID int not null,      
  SALESDATE     DATETIME      NOT NULL,
        RVersion    RowVersion 
);
GO

INSERT INTO SALES2 (RowID,SALESDATE) VALUES (1,'October 10, 2005');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (2,'November 10, 2005 10:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (3,'December 6, 2005 11:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (4,'January 5, 2006');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (5,'02/07/2006');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (6,'03/08/2006 14:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (7,'04/06/2006 15:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (8,'20060504');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (9,'20060606 17:01:01');
INSERT INTO SALES2 (RowID,SALESDATE) VALUES (10,'20060706 19:01:01');
GO

select * from sales2

update sales2
set SALESDATE = '20090104 01:01:01'
where rowID=5

select * from sales2


Petites informations utiles

1) Il est possible d'obtenir la valeur courante de TimeStamp (et forcément de RowVersion) en utilisant la requête SQL suivante:
select @@dbts as 'TimeStamp current value';

2) Il est possible de stocker une copie d'un TimeStamp/RowVersion (ex: pour les tables d'audit). Dans ce cas, veillez à utiliser le data type BigInt (utilisant également 8 bytes pour stocker ses valueurs).


Référence: The "TimeStamps and MS SQL Server" article

Aucun commentaire: