2010-12-05 18 views
5

J'ai une colonne dans ma table, disons updateStamp. Je voudrais obtenir une approche pour mettre à jour ce champ avec un nouveau numéro séquentiel lors de la mise à jour de la ligne.SQL Server - comment générer un numéro séquentiel unique sur la mise à jour

La base de données a beaucoup de trafic, principalement lu, mais plusieurs mises à jour simultanées peuvent également se produire par lots. Par conséquent, la solution devrait provoquer des verrous minimes.

La raison de cette exigence est que j'ai besoin d'une solution permettant aux clients de parcourir la table vers l'avant et si une ligne est mise à jour, elle devrait revenir sur le jeu de résultats.

Ainsi, la requête serait alors comme

SELECT * 
FROM mytable 
WHERE updateStamp > @lastReturnedUpdateStamp 
ORDER BY updateStamp 

Malheureusement horodatages ne fonctionnent pas ici parce que plusieurs mises à jour pourraient se produire en même temps.

+0

Qu'est-ce que version de SQL Server êtes-vous? Si SQL Server 2008 pense que 'change tracking' fait ce dont vous avez besoin et contourne les problèmes subtils avec' timestamps' et les temps de validation des transactions. –

+0

2008 R2, j'utilise. Merci pour suggestion! Je n'étais pas au courant de cette fonctionnalité. Bien que ce soit une surpêche pour mes besoins. – user431529

Répondre

2

Le type de données timestamp (obsolète) ou rowversion (actuel) est le seul que je connaisse qui soit mis à jour à chaque opération d'écriture sur la ligne. Ce n'est pas un horodatage en soi - il ne stocke pas la date, l'heure en heures, les secondes, etc. - c'est vraiment plus un RowVersion (d'où le changement de nom) - un nombre unique et croissant (binaire) sur la ligne.

Il est généralement utilisé pour vérifier les modifications entre le moment où vous avez lu la ligne et le moment où vous allez la mettre à jour.

Comme ce n'est pas vraiment une information de date/heure, vous devrez probablement avoir une autre colonne pour cette information lisible par l'homme. Vous pouvez ajouter une colonne LastModified DATETIME à votre table et, avec une contrainte DEFAULT GETDATE(), vous pouvez insérer une nouvelle valeur lors de l'insertion. Pour le garder à jour, vous devrez écrire un déclencheur AFTER UPDATE pour mettre à jour la colonne LastModified lorsqu'une mise à jour se produit.

SQL Server 2011 (alias « Denali ») nous apportera SEQUENCES qui serait l'ajustement parfait dans votre cas ici - mais hélas, que » encore au moins un an de sortie officielle .....

+0

Ceci est parfait pour mon cas. Testé et ça fonctionne bien! Chose étrange, cependant, SQL Server Management Studio ne propose pas de type de données rowversion dans la boîte de suggestion. Donc, vous devez utiliser l'horodatage pour le moment. – user431529