2011-01-21 17 views
2

テーブルイベントにはトリガではなく1つのプライマリキーイベントIDが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 

は今、時には、それはまだ缶を言いますイベントIDに重複を挿入していません、なぜこれが起こっているのかわかりません...

トリガーが起動していないようですね。理由

答えて

2

おそらく、挿入された疑似テーブルに1つの行があり、複数行の挿入が発生したときにエラーが発生したとします。あなたが何かしたい

;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 - 正直言って、私は間違った問題を解決していました - テーブルに複数の行を1つのINSERT文で挿入している可能性があります。しかし、私は上記の答えを信じています。これは、「MAXの検索、それに基づく新しいID値の処理、新しい値の挿入」を1つのステートメントとして扱うためです。ロックする必要はありませんヒント、または分離レベルの変更。 –

1

重複するIDが生成されないようにするには、何らかの種類のロックを使用する必要があります。これに対処する方法については、同様の問題のthis threadを見てください。

+0

をはい、私はそうは一度にレコードの束を挿入し、2008年のこの使用してテーブルタイプを挿入しています。 – Lalit

関連する問題