Mim

Select * from Seb where Sujets in (SQL Server 2008, ADO.NET, Visual Studio 2008)

Sql Serveur 2005 SP2 : 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.ClientWithRowVersion

Le résultat est :

(1 row(s) affected) version
---------------------------
0x00000000000007D3

Maintenant 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
0x00000000000007D3

Le 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
0x00000000000007D5

Que 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...

La prochaine question est donc : Mais comment faire de la synchro ? :)

Stay tuned ;)