Проблема с IDENTITY

Alexey
Дата: 09.06.2000 12:55:04
Hello All,

столкнулся с проблемой:
при добавлении записи в таблицу, у которой PrimaryKey это IDENTITY int,
MSSQL 6.5 пишет, что нарушается уникальность ключа !?

Может кто объяснит из-за чего это бывает и, главное, как с этим бороться?

С уважением, Алексей.
wlad
Дата: 12.06.2000 06:44:31
Действительно существует проблема с IDENTITY на SQL Server 6.5 - в основном это проявляется после перезагрузки сервера - при этом почему-то теряется последнее значение. Поэтому совет такой - не пользоваться IDENTITY на шестерке на постоянных таблицах, на временных же все работает корректно. Генерите значение сами, или переходите на семерку!!!
Levi
Дата: 27.06.2000 10:17:48
Такая проблема возникала при использовании trial версии. Счётчик падал после истечения 120 дней. Хотя это, если правильно помню, происходило иногда и чаще. Лечение такое (лечить приходится при каждом падении):
необходимо выполнить примерно такой скрипт

DECLARE @MaxID int
SELECT @MaxID=max(ID) FROM Table
SET IDENTITY_INSERT Table ON
INSERT Table (ID,...) VALUES (@MaxID+1,...)
SET IDENTITY_INSERT Table OFF
DELETE Table WHERE ID=@MaxID+1

Он начнёт счётчик с @MaxID+1, после чего "мусорная" запись удаляется. Эту процедуру надо повторить для каждой таблице, где глюканул счётчик.
Естественно, это не кардинальное решение, но данные спасти можно и сервер успокаивается ещё на несколько месяцев.
Рекомендую перейти на SQL Server 7 или на SQL Server 2000 b2. Здесь этой проблемы нет (по опыту 1.5 лет активной эксплуатации в корпоративной задаче).

Слава Левашёв (asklevi@email.com)
Victor
Дата: 30.08.2000 05:23:57
У меня иногда бывает такая ошибка при работе 1С Предприятия для MSSQL 6.5, когда клиент зависает на какой-то операции записи.
Лечится командой
dbcc checkident (таблица).
Так как это может затрагивать несколько таблиц, я написал следующую процедуру, которая делает эту команду по всем таблицам, имеющим поле IDENTITY.

create procedure _1BVN_IDENT
as
declare @table varchar(30), @s varchar(50)
declare object_cursor cursor for
select name from sysobjects
where (type = 'U') and (category & 0x1 = 1)
open object_cursor
fetch next from object_cursor into @table
while (@@fetch_status <> -1)
begin
if (@@fetch_status <> -2)
begin
print @table
select @s = "dbcc checkident (" + @table + ")"
exec ( @s )
end
fetch next from object_cursor into @table
end
print "Identity values have been updated for all tables."
deallocate object_cursor