Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql Server触发器_Sql Server_Triggers - Fatal编程技术网

Sql server Sql Server触发器

Sql server Sql Server触发器,sql-server,triggers,Sql Server,Triggers,我有一个有4个字段的表 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 并防止插入重复记录。我写了非常基本的触发器。

我有一个有4个字段的表

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
并防止插入重复记录。我写了非常基本的触发器。现在帮我完成这个。先谢谢你


如果您使用的是SQL Server 2008,您可以使用

,正如Joe Stefanelli所说,最好的方法是通过使用insert或update存储过程并撤销表上的insert PERM来替换表中的直接插入

但是,如果您对触发器没有兴趣,请尝试将以下内容添加到触发器中

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];

我将把我的评论整理成一个答案


在这种情况下,我会避免使用触发器。我认为最好的方法是编写一个可以从代码中调用的存储过程。如果存在,该存储过程将执行
。。。更新。。。否则插入…
逻辑。

如果主键是
(col1,col2,col3)
,则当
xyz2
已经存在时,用户将永远无法插入
xyz3
。这将违反您的主键。@Joe是的,您是对的,在执行此操作之前,我创建了此主键以防止重复,但现在我想更新表中存在的记录,因此解决此问题后,我将删除主键或扩展到四列;)@萨德格:你为什么要把这个放在扳机上?为什么您不能测试代码中是否存在,并在适当的时候更新/插入。@Joe好吧,我将把我的业务逻辑的一部分从代码转换到db端,以获得更完整的功能@萨德格:我以前的建议仍然适用。从代码端调用将执行
的存储过程(如果存在)…更新。。。else insert…
logic。亲爱的Joe,我真的不使用我应用程序中的任何sp,我使用DLINQ做任何事情!正因为如此,我要用触发器来解决我的问题;)
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];