Этот триггер на самом деле является заданием опроса, которое проверяет элементы с идентификатором, превышающим MAX (ID), обнаруженный при последнем запуске. Потеря записей является неотъемлемой проблемой опроса с использованием значения IDENTITY. На самом деле вы обнаружите, что кто-то спрашивает, почему этот метод опроса использовался в посте блога, в котором представлен SQL-коннектор
Повторная идентификация
Единственным решением при использовании IDENTITY является повторное заполнение значения IDENTITY с помощью:
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10000);
Где 10000 - это число, превышающее максимальное значение IDENTITY, использованное перед усечением.
Более надежным решением было бы изменить реализацию опроса, чтобы обнаруживать и использовать SQL Server Отслеживание изменений . Обнаружение По какой-то причине это не было реализовано.
Использовать последовательности вместо IDENTITY
Другое решение заключается в использовании SEQUENCE вместо IDENTITY для создания новых идентификаторов. Последовательности являются независимыми объектами базы данных, поэтому усечение таблицы не повлияет на последовательность. Фактически, вы можете использовать одну и ту же ПОСЛЕДОВАТЕЛЬНОСТЬ по умолчанию для нескольких таблиц
Например, вы можете определить эту последовательность:
CREATE SEQUENCE MySequence
START WITH 1
INCREMENT BY 1 ;
И использовать его как ограничение по умолчанию для первичного ключа:
CREATE TABLE MyTable
(
ID bigint PRIMARY KEY
)
ALTER TABLE MyTable
ADD
DEFAULT NEXT VALUE FOR MySequence
FOR ID;