vendredi 23 novembre 2007

MIN_ACTIVE_ROWVERSION

Depuis l'arrivée du Service Pack 2 de Sql Serveur 2005, est apparue une nouvelle fonction appellée MIN_ACTIVE_ROWVERSION()
Cette fonction permet de renvoyer la prochaine valeur de type Timestamp à insérer dans la base de donnée.En comparaison avec ce qui se faisait avant le SP2, MIN_ACTIVE_ROWVERSION() correspond à la valeur renvoyée par @@DBTS + 1.
Note : Nous allons travailler avec un type timestamp. Sachez que ce type peut être aussi appellée rowversion. D'ailleurs les deux écritures sql sont correctes.
Prenons un exemple : Voici une table contenant une colonne de type timestamp

Create table Person.ClientWithRowVersion (version ROWVERSION)Nous allons insérer une nouvelle ligne dans cette table, puis faire une Select pour récupérer le résultat :
Insert Into Person.ClientWithRowVersion Values (DEFAULT)
Select * from Person.ClientWithRowVersionLe résultat est :
(1 row(s) affected) version
---------------------------
0x00000000000007D3Maintenant effectuons un test sur la valeur renvoyée par MIN_ACTIVE_ROWVERSION() et par @@DBTS
print 'MIN_ACTIVE_ROWVERSION : '
print MIN_ACTIVE_ROWVERSION()
print '@@DBTS'
print @@DBTS
------------------------------------------------------------------
MIN_ACTIVE_ROWVERSION :
0x00000000000007D4
@@DBTS
0x00000000000007D3Le résultat attendu est bien correct, MIN_ACTIVE_ROWVERSION() est bien la prochaine valeur insérée et @@DBTS la valeur en cours.
La où cela devient intéressant (et où l'on comprend l'intéret de cette nouvelle fonction) c'est lors de l'ajout d'une transaction dans notre exemple.Nous allons récupérer les valeurs PENDANT la transaction :
BEGIN TRAN

INSERT INTO Person.ClientWithRowVersion VALUES (DEFAULT)
SELECT * FROM Person.ClientWithRowVersion
GO

PRINT 'MIN_ACTIVE_ROWVERSION'
PRINT MIN_ACTIVE_ROWVERSION()
PRINT 'DBTS'
PRINT @@DBTS
GO

COMMIT

---------------------------------------
0x00000000000007D5

(1 row(s) affected)

MIN_ACTIVE_ROWVERSION
0x00000000000007D5
DBTS
0x00000000000007D5Que constatons nous ? Que la valeur de MIN_ACTIVE_ROWVERSION n'a pas été encore mise à jour, alors que celle de DBTS, si .
Là où cette implémentation est judicieuse, c'est lors de l'utilisation de cette fonction lors d'une synchronisation.L'un des principes lors d'une synchronisation, c'est la récupération des enregistrements de la base de données Source.Grâce à l'utilisation de MIN_ACTIVE_ROWVERSION() vous êtes sûr de ne récupérer que les enregistrements VALIDES par la base de données, et non des enregistrements en cours de validation et donc potentiellement incorrects...
Par Sébastien Pertus publié le 23/11/2007 à 11:00

Aucun commentaire: