SQL Server - как да генерирам уникален пореден номер при актуализация

Имам колона в таблицата си, да кажем updateStamp. Бих искал да получа подход за актуализиране на това поле с нов пореден номер при актуализиране на реда.

Базата данни има много трафик, предимно четене, но множество едновременни актуализации също могат да се случат на партиди. Следователно решението трябва да предизвиква минимални ключалки.

Причината за това изискване е, че трябва да имам решение за клиентите, които да итерират таблицата напред и ако ред се актуализира - той трябва да се появи отново в набора от резултати.

Така че тогава заявката ще бъде като

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

За съжаление клеймото за време не работи тук, защото могат да се случат няколко актуализации едновременно.


person user431529    schedule 05.12.2010    source източник
comment
Каква версия на SQL Server използвате? Ако SQL Server 2008 мисля, че change tracking прави това, от което се нуждаете, и заобикаля фините проблеми с timestamps и времената за ангажиране на транзакция.   -  person Martin Smith    schedule 06.12.2010
comment
2008 R2, използвам. Благодаря за предложението! Не знаех за такава функция. Въпреки че това е прекалено много за моите изисквания.   -  person user431529    schedule 06.12.2010


Отговори (1)


Типът данни timestamp (отхвърлен) или rowversion (текущ) е единственият, за който знам, че се актуализира при всяка операция за запис в реда.

Това не е клеймо за време само по себе си - не съхранява дата, час в часове, секунди и т.н. - наистина е по-скоро RowVersion (оттук и промяната на името) - уникално, непрекъснато нарастващо число (двоично) в реда.

Обикновено се използва за проверка за всякакви модификации между момента, в който сте прочели реда, и момента, в който ще го актуализирате.

Тъй като всъщност не е информация за дата/час, най-вероятно ще трябва да имате друга колона за тази информация, която може да бъде прочетена от човека. Можете да добавите LastModified DATETIME колона към вашата таблица и с ограничение DEFAULT GETDATE() можете да вмъкнете нова стойност при вмъкване. За да го поддържате актуален, ще трябва да напишете тригер СЛЕД АКТУАЛИЗАЦИЯ, за да актуализирате колоната LastModified, когато настъпи актуализация.

SQL Server 2011 (a.k.a. Denali) ще ни донесе SEQUENCES, което би било идеалното решение за вашия случай тук - но уви, това е още поне година след официалното пускане.....

person marc_s    schedule 05.12.2010
comment
Това идеално пасва на моя случай. Тествано и работи добре! Странно нещо обаче, студиото за управление на SQL Server не предлага тип данни за версия на ред в полето за предложения. Така че засега трябва да използвам клеймо за време. - person user431529; 06.12.2010