2011-01-21 90 views
2

表事件有一个而不是触发器,其目的是生成主键EventId为Max + 1,其余列从插入填充。SQL而不是触发器有时不会触发?

EVENTID不认同,我们不能让它身份有很多depedency的存在,触发逻辑:

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,不知道为什么这是happning ...

看起来像触发器在某些情况下不会触发?为什么

回答

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 2011-01-21 14:59:03

1

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

+0

是的,我将2008年的这个利用表型,一下子让插入一堆记录。 – Lalit 2011-01-21 14:43:58