2011-01-21 4 views
2

В таблице Event есть один вместо триггера, целью которого является генерация первичного ключа EventId как Max + 1, остальные столбцы заполняются из вставленного.SQL Вместо триггера иногда не срабатывает?

EventId не идентичность, и мы не можем сделать его идентичность как есть много depedency там, Trigger логика:

SELECT TOP 1 @ID = Event.EventID FROM Event 
IF (@ID IS NULL) 
BEGIN 
    SET @ID=1 
END 
ELSE 
BEGIN 
    SELECT @ID = MAX(Event.EventID) FROM Event 
    SET @[email protected]+1 
END 
--Then just a insert statment with this id as EventId and rest of the columns from inserted table 

Теперь иногда, когда я попытался вставить в эту таблицу, она по-прежнему говорит, что может Вставьте дубликат в eventId, Не знаете, почему это происходит ...

Похоже, что триггер не является огнем в каком-то случае? Почему

ответ

2

Возможно, вы предполагаете, что во вставленной псевдо-таблице есть одна строка, а при вводе многострочной вставки.

Вы хотите что-то вроде:

;with maxID as (
    select MAX(EventID) as EventID from Event 
), nrows as (
    select 
     ROW_NUMBER() OVER (ORDER BY newid()) + 
      COALESCE((select EventID from maxID),0) as EventID, 
     /* columns from inserted table */ 
    from inserted 
) 
insert into Event (EventID,/* other columns */) 
select EventID,/* other columns */ 
from nrows 
+0

Итак, это добавит некоторый тип блокировки, позвольте мне попробовать ... – Lalit

+0

Это работало как бог, но не могли бы вы объяснить, в чем была проблема с предыдущей логикой. Это из-за блокировки стола? – Lalit

+0

@Lalit - если честно, я решал (возможно) неправильную проблему - я думал, что вы можете вставлять несколько строк в таблицу в один оператор 'INSERT'. Но я верю в вышеупомянутый ответ, потому что он касается всего «поиска MAX», выработки новых идентификационных значений на его основе, вставки новых значений «как одного оператора», поэтому вам не нужно гадать с блокировкой подсказки или изменение уровней изоляции. –

1

Для предотвращения дублирования идентификационных данных вам необходимо использовать блокировку. Взгляните на this thread аналогичной проблемы для идей о том, как справиться с этим.

+0

Да, я вставляя это с помощью таблицы типа 2008, так вставив кучу записей сразу. – Lalit