2010-10-27 256 views
2

我有一個表有4個字段。Sql Server觸發器

Col1 Guid Primary-Key (FK to another table) 
Col2 Guid Primary-Key (FK to another table) 
Col3 Int Primary-Key 
Col4 Int 

現在我想這樣做:當用戶插入一個新的記錄,其具有相同的值作爲記錄在表之前存在類似如下:

有這樣記載:

X Y Z 2 

新紀錄

X Y Z 3 

更新現有的記錄下面:

X Y Z 5 

並且還防止插入重複記錄。我寫了非常基本的觸發器。現在幫我完成這個。提前致謝。 ;)

CREATE TRIGGER [Tbl].[TriggerName] 
ON [dbo].[Tbl] 
AFTER INSERT, UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 
UPDATE [dbo].[Tbl] 
SET [dbo].[Tbl].[Col4] += [Inserted].[Col4] 
From [dbo].[Tbl] INNER JOIN [Inserted] ON [dbo].[Tbl].[Col1] = [Inserted].[Col1] AND 
              [dbo].[Tbl].[Col2] = [Inserted].[Col2] 
WHERE [dbo].[Tbl].[Col3] = [Inserted].[Col3]; 
//How to prevent from inserting duplicate record? 
END 
+1

如果你的主鍵是'(col1,col2,col3)',當'X Y Z 2'已經存在時,用戶將永遠不能插入'X Y Z 3'。這會違反你的主鍵。 – 2010-10-27 14:57:13

+0

@Joe是的,你是對的,在做這個之前,我創建了這個主鍵來防止重複,但現在我想更新表中存在的記錄,所以在解決這個問題之後,我要去除主鍵或擴展到四列;) – Sadegh 2010-10-27 15:04:59

+1

@Sadegh:你爲什麼試圖把它放在觸發器中?爲什麼你不能在你的代碼中測試存在,並在適當的時候更新/插入。 – 2010-10-27 15:12:26

回答

1

我要鞏固我的意見變成一個答案。

我會避免在這種情況下使用觸發器。我相信你最好的辦法是編寫一個存儲過程,你可以從你的代碼中調用。該存儲過程將執行if exists... update... else insert...邏輯。

+0

親愛的喬,我真的不使用我的應用程序中的任何sp,我使用DLINQ來做任何事情!因爲我要通過觸發來解決我的問題;) – Sadegh 2010-10-27 15:56:09

1

如果您使用SQL Server 2008中您可以使用MERGE

+0

感謝它很棒 – Sadegh 2010-10-27 16:06:37

1

正如喬·斯特凡內利說,最好的辦法是由具有嵌入或更新,以取代直接插入到表存儲過程並撤銷表上的INSERT權限。

但是,如果你是死心塌地的扳機,嘗試添加下列到觸發

DELETE [dbo].[Tbl] 
From [dbo].[Tbl] INNER JOIN [Inserted] ON [dbo].[Tbl].[Col1] = [Inserted].[Col1] AND 
              [dbo].[Tbl].[Col2] = [Inserted].[Col2] 
WHERE [dbo].[Tbl].[Col3] = [Inserted].[Col3] AND [dbo].[Tbl].[Col4] = [Inserted].[Col4];