Большинство моих баз данных используют столбцы IDENTITY в качестве первичных ключей. Я пишу журнал изменений/контрольный журнал в базе данных и хочу использовать идентификатор BIGINT для последовательного отслеживания изменений.
Хотя BIGINT довольно большой, однажды он иссякнет, и мой дизайн не будет работать должным образом в этот момент. Я знал об этой проблеме с другими столбцами идентификаторов и намеревался в конечном итоге преобразовать их в GUID/UUID, как я использовал в Postgres в прошлом.
GUID занимает 16 байт, а BIGINT — 8. Для моей текущей задачи я хотел бы остаться с BIGINT для экономии места и последовательности. В Postgres я создал пользовательскую последовательность, в которой первые две цифры обозначают текущий год, а фиксированное количество цифр — последовательность внутри года. Генератор последовательности автоматически сбрасывает последовательность при изменении года.
SQL Server 2008 не имеет генератора последовательностей. Мое исследование выявило некоторые идеи, большинство из которых включают использование таблицы для хранения порядкового номера, обновление его в транзакции, а затем использование его для присвоения моим данным в отдельной транзакции.
Я хочу написать SP или функцию, которая будет обновлять последовательность и возвращать мне новое значение при вызове из триггера в целевой таблице до записи строки. Есть много идей, но все они, кажется, говорят о проблемах блокировки и изоляции.
Есть ли у кого-нибудь предложения о том, как автоматизировать назначение этого идентификатора, защитить процесс от назначения дубликатов при одновременной записи и предотвратить проблемы с задержкой блокировки?
BIGINT IDENTITY
, начиная с 1, и вставляете одну тысячу строк каждую секунду, вам потребуется ошеломляющее 292 миллиона лет, прежде чем вы достигнете предела в 922 квадриллиона. .. Вас это ДЕЙСТВИТЕЛЬНО беспокоит? - person marc_s   schedule 24.01.2014