И можно наблюдать разрыв в идентификации записей.
И еще один нюанс, даже если удалить все записи из
таблицы, последующие идентификаторы, возвращаемые сервером, не обнулятся, а
будут продолжать увеличиваться, как будто записи не удалялись. В некоторых
случаях может понадобиться обнулить серверный генератор последовательностей или
проинициализировать его каким-нибудь другим значением. Для этих целей
существует системная функция DBCC CHECKIDENT. С ее помощью можно проверить
счетчик «на правильность» и/или проинициализировать его новым значением. Если
же необходимо сбросить счетчик в начальное значение при удалении всех записей, то можно воспользоваться не оператором DELETE, а оператором TRUNCATE. В этом
случае счетчик автоматически сбросится в первоначальное значение, но следует
помнить, что TRUNCATE нельзя пользоваться, если на таблицу ссылаются внешние
ключи других таблиц.
Существуют так же специальные команды, с помощью
которых можно узнать начальное значение генератора определенной таблицы и
приращение, то есть те значения, которые были установлены при указании IDENTITY.
Это IDENT_INCR и IDENT_SEED соответственно.
Таким образом, в свете всего вышесказанного, самый
типичный сценарий применения автоинкремента выглядит примерно так:
DECLARE @PrimaryKey int
BEGIN TRAN
INSERT INTO MasterTbl (<... some fields ...>) VALUES (<...
some values ...>)
SET @PrimaryKey = SCOPE_IDENTITY()
INSERT INTO DetailTbl (ForeignKey, <... some other fields ...>)
VALUES (@PrimaryKey, <...some other values ...>)
COMMIT
|
Глобальный идентификатор
Идентификатор в пределах таблицы – это конечно здорово, но отнюдь не предел мечтаний. В некоторых случаях вовсе не лишней была бы
возможность получить запись, гарантировано уникальную в пределах базы данных, экземпляра сервера или даже в пределах всех серверов предприятия. Для
уникальности в пределах БД тип данных int, может еще и сгодится, но вот если
брать что-то более глобальное, то четырех миллиардов уникальных значений может
и не хватить. Max(int) – это много, но не так много как хотелось бы, проблема в
том, что назначая новое автоинкрементное поле, которое по идее должно быть
гарантировано уникальным при любых обстоятельствах, приходится думать о других
уникальных полях, чтобы ни коим образом диапазоны их идентификаторов не
пересеклись, а отсюда и совершенно неестественные ограничения.
Для выхода из подобной ситуации Microsoft предлагает
использовать тип данных uniqueidentifier - 16 байтное число, которое, будучи
сгенеренным с помощью специальной функции, является гарантировано уникальным
при любых обстоятельствах. Вся прелесть такого подхода заключается в том, что
такой идентификатор, будучи полученным на одном сервере, заведомо не
пересечется с другими подобными же идентификаторами, полученными на других
серверах. Уникальный идентификатор получается с помощью функции NewID().
Типичный сценарий работы с таким идентификатором выглядит примерно так:
DECLARE @PrimaryKey uniqueidentifier
BEGIN TRAN
SET @PrimaryKey = NewID()
INSERT INTO MasterTbl (PrimaryKey, <... some fields ...>) VALUES
(@PrimaryKey, <... some values ...>)
INSERT INTO DetailTbl (ForeignKey, <... some other fields ...>)
VALUES (@PrimaryKey, <...some other values ...>) Рекомендуем скачать другие рефераты по теме: скачать доклад на тему, решебник по математике класс виленкин.
Предыдущая страница реферата | 2
3
4
5
6
7
8
9
10
11
12 | Следующая страница реферата
|
|