2011-09-26 66 views
2

這是在SQL Server 2005PK違反

我有一個地址表:

dbo.Address 
(
    AddressID INT IDENTITY(1, 1) PRIMARY KEY 
    LastUpdateBy VARCHAR(30) 
    <bunch of address columns> 
) 

我也有一個歷史表:

dbo.AddressHistory 
(
    AddressID INT, 
    AsOf DATETIME, 
    UpdateBy VARCHAR(30) 
    <all the address columns> 
    CONSTRAINT PK_dbo_AddressHistory PRIMARY KEY CLUSTERED (AddressID, AsOf) 
) 

我有一個觸發dbo.Address在INSERT和UPDATE上創建歷史記錄條目,它將基本上這樣做:

INSERT INTO dbo.AddressHistory(AddressID, AsOf, UpdateBy, <address columns>) 
SELECT AddressID, CURRENT_TIMESTAMP, @UpdateBy, <address columns> 
FROM INSERTED 

但是,每過一段時間,我都會對dbo.AddressHistory抱怨一個插入PK的重複PK。如果AddressHistory的PK的一部分是插入的當前時間戳,這怎麼可能?

即使執行,這將插入兩行成功的歷史表:

INSERT INTO dbo.Address 
(LastUpdateBy, <address columns>) 
SELECT 'test', <address columns> 
FROM dbo.Address 
WHERE AddressID < 3 

而唯一的更新存儲過程我對dbo.Address表將更新爲給定的AddressID一行。所以它應該只是一次更新一行。我的插入代碼片段一次只能插入一行。

任何想法是什麼情況導致這種情況發生?

+2

@Joe:CURRENT_TIMESTAMP變爲3.33毫秒,如GETDATE() – gbn

+0

您是否有UPDATE觸發器? – gbn

+0

是觸發器在UPDATE和INSERT上,對不起。編輯... – Tedderz

回答

7

根據您的描述,使用相同參數執行存儲過程的兩次併發執行似乎很可能。

datetime只有1/300秒的精度,因此如果這些執行發生的非常接近,可能會發生衝突。