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() вы можете вставить новое значение при вставке. Чтобы поддерживать это в актуальном состоянии, вам нужно будет написать триггер AFTER UPDATE для обновления столбца LastModified при любом обновлении.

SQL Server 2011 (он же Denali) принесет нам SEQUENCES что идеально подошло бы в вашем случае, но, увы, до официального релиза еще как минимум год.....

person marc_s    schedule 05.12.2010
comment
Это идеально подходит для моего случая. Проверено, работает нормально! Странно, однако, что студия управления SQL Server не предлагает тип данных rowversion в поле предложения. Итак, пока нужно использовать временную метку. - person user431529; 06.12.2010