2010-10-27 141 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];