2011-01-21 130 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