Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
Существует ли способ запретить SQL Server 2000 увеличивать текущее значение счетчика в таблице с автоинкриментом при вставе записи с SET IDENTITY_INSERT ... ON со значением IDENTITY, большего текущего значения счетчика?
20 июл 09, 15:55    [7436475]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
навесить констрейнт на таблицу.

для спящего время бодрствования равносильно сну
20 июл 09, 15:58    [7436499]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
f.d.a,

? а вы чего собственно хотите достичь? вообще всегда есть DBCC CHECKIDENT, но вы в таком случае рискуете получить дублирование в дальнейшем.
20 июл 09, 15:58    [7436502]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
2 автор:
Немного не ясно, чего именно Вы хотите
Проиллюстрируйте, пожалуйста Ваш вопрос каким-нибудь репро
Например, "запускаю такой-то скрипт и получаю такой-то результат,
а хотелось бы вот такой результат"
20 июл 09, 15:59    [7436511]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
я так понял у автора есть таблица с idenity
и он хочет запретить вставку записей, если identity больше какогото мифического значения...

для спящего время бодрствования равносильно сну
20 июл 09, 16:13    [7436589]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
Алексей2003,
а при чем тут текущее значение счетчика? Если значение известно заранее - тогда конечно констрайнт, а в такой формулировке - разьве что фильтр по Ident_current('table') ставить...
20 июл 09, 16:16    [7436608]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
Glory
Member

Откуда:
Сообщений: 104760
Скорее всего, автор хочет, чтобы после SET IDENTITY_INSERT и добавления одной записи со значением к примеру 1000, друигие, нормальные insert-ы продолжали добавляться не 1001, а со "старого" значения, например с 11
20 июл 09, 16:18    [7436619]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
Существует многопользовательская БД. Все таблицы с автоинкрементным identity N(15). БД реплицируемая. Репликация реализована на триггерах.

Обмен данными двухсторонний по схеме 60 ->1 (общая база) и 1 -> 60, возможна ретрансляция данных переданных одной из 60 точек во все другие, через общую базу.

Уникальность записей БД участвующих в обменене поддерживается за счет ранее определенных диапазонов ID.

Необходимо обеспечить одновременную работу пользователей БД и входящей репликации в общей базе.

Беда в том, что рабочие ID в общей базе < ID остальных точек, плюс вносит подобный эффект и ретрансляция данных из 1-точки в другие.

Использование DBCC CHECKIDENT после выполнения INSERT-а входящей репликации во время работы пользователей (вставка пользователем записи блокирует ее до окончания ввода, схема INSERT-UPDATE) приводит к возникновению ошибки 7998 Checking identity information: current identity value '%.*hs', current column value '%.*hs'.
20 июл 09, 16:28    [7436673]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
К сожалению, в репликациях не силен, ничем помочь не могу
Единственное, что хотелось бы заметить - возможно, Вам следует подумать об использовании guid-ов
20 июл 09, 16:32    [7436700]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
к сожалению, все запущено, база массивная и очень сложная по структуре для внесения таких изменений
20 июл 09, 16:35    [7436723]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
Паганель
К сожалению, в репликациях не силен, ничем помочь не могу
Единственное, что хотелось бы заметить - возможно, Вам следует подумать об использовании guid-ов


+1. с идентити в такой конфигурации огребете непомерного геморроя.
20 июл 09, 16:36    [7436729]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
f.d.a,
тогда в основной базе отключите identity и сделайте триггер, в котором генерите нужное вам значение на основе sequence-эмулятора.
20 июл 09, 16:40    [7436763]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
С удовольствием, но, приложение многооконное (транзакции вложенные), принцип вставки записей BEGIN TRAN - INSERT - ВВОД - UPDATE - END TRAN.

Кроме того, транзакции могут быть открыты утром, а вспомнят о не завершенной операции лишь вечером, пользователей тьма, а использование счетчика вида SELECT MAX(id)+1 FROM ... WITH (HOLDLOCK,UPDLOCK) приводит к ожиданию завершения всех транзакций на таблице.

К сожалению, выгодного решения сколько не ищу пока не нашел...
20 июл 09, 16:49    [7436816]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
f.d.a,
? а кто говорил про max(id)?? Это очень порочная практика:) а делается это примерно так:
1.
create table Sequence_1 (id numeric(15) identity(N,1))
2. В триггере:
insert into Sequence_1 values(default)
set @NewId = scope_ident()
delete from Sequence_1

дальше понятно?
20 июл 09, 16:57    [7436867]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
честно говоря нет, необходим триггер который, во-первых, сработает ранее всех остальных и каким-то образом определить для inserted вычисленный id, операции над inserted возможны?
20 июл 09, 17:09    [7436941]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
f.d.a,
во-первых - порядок срабатывания триггеров можно задать.
во-вторых - зачем вам операции над inserted? триггер явно будет instead of.
ну и в-третьих - тут вообще можно без триггера обойтись, а генерить новое значение перед выполнением вставки.
BEGIN TRAN - НОВОЕ ЗНАЧЕНИЕ- INSERT - ВВОД - UPDATE - END TRAN
20 июл 09, 17:13    [7436969]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
iljy, спасибо за вариант, абсолютно подходит, сам не дошел.
20 июл 09, 23:43    [7437880]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
f.d.a
Member

Откуда:
Сообщений: 7
С триггером INSTEAD OF повешенным на таблицы, разобрался, ранее пользовался толька на вьюхах. Данный, очень удачный вариант, реализации псевдо последовательности, в разработанной архитектуре программы и БД более подошел для использования в SP, собственна у меня вся реализация INSERT/UPDATE на них. Еще раз выражаю свою благодарность.
21 июл 09, 08:11    [7438176]     Ответить | Цитировать Сообщить модератору
 Re: Без шаманства не обойтись: identity  [new]
iljy
Member

Откуда:
Сообщений: 8711
f.d.a,

не за что:) пользуйтесь.
21 июл 09, 09:21    [7438337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить