SQL вместо триггера не срабатывает иногда? - PullRequest
2 голосов
/ 21 января 2011

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

EventId не является Identity, и мы не можем сделатьэто идентичность, поскольку там много зависимости, логика триггера:

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 @ID=@ID+1
END
--Then just a insert statment with this id as EventId and rest of the columns from inserted table

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

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

Ответы [ 2 ]

2 голосов
/ 21 января 2011

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

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

;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
1 голос
/ 21 января 2011

Вам нужно использовать какую-то блокировку, чтобы предотвратить создание дублирующих идентификаторов. Посмотрите на эту ветку аналогичной проблемы, чтобы узнать, как ее решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...