SQL而不是触发器有时不会触发?

时间:2011-01-21 14:26:31

标签: sql sql-server sql-server-2008 triggers

表事件有一个而不是触发器,其目的是生成主键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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您需要使用某种锁定来防止生成重复的ID。看一下类似问题的this thread,了解如何解决这个问题。