Sql触发器在表更新时添加新行

时间:2016-05-10 13:39:07

标签: sql sql-server triggers

我是sql触发器的新手,并且学习as.net.net应用程序的开发触发器。我遇到的情况是我需要先保存表然后编辑同一个表 - 这个编辑在不同的表中创建新行但是问题是每次我编辑表时它在不同的表中创建新行我想在不同的表中创建行只进行第一次编辑。

将我的问题分开以便于阅读。

我有两张桌子: 表A和表B

我在表A上写了触发器,在表B中添加了行。

问题: 每次我编辑表A中的行时,都会在表B中添加一个新行。(因此每次编辑都会创建新行)

所需结果: 我希望我的触发器在表B中只添加一行,用于表A中的第一次编辑,但不能用于后续编辑。

我正在使用更新触发器。 任何带代码的例子都会很棒 非常感谢你。

Create TRIGGER [dbo].[triggerName] ON [dbo].[databaseName]
For Update
As
Begin
DECLARE @i int
DECLARE @d int
DECLARE @action char(6)
DECLARE @Car VARCHAR(20)

IF (@@ROWCOUNT = 0) RETURN

SELECT @i = Count(*) From Inserted
SELECT @d = Count(*) From Deleted

SELECT @action = CASE 
WHEN (@i <> 0) and (@d <> 0) THEN 'UPDATE'
WHEN (@i = 0) and (@d <> 0) THEN 'DELETE'
WHEN (@i <> 0) and (@d = 0) THEN 'INSERT'
End


SELECT @Car = A From inserted


IF @action = 'UPDATE' AND @Car in ('BMW')

   Begin
    INSERT INTO Tableb (c,d,f)
    Select c,d,f from inserted
   End

2 个答案:

答案 0 :(得分:0)

您可以修改SQL触发器,使其仅在INSERT

之后执行
CREATE TRIGGER dbo.myTable_Insert
 ON dbo.myTable
AFTER INSERT
AS

在插入,更新或删除之后可以create SQL trigger运行,如参考教程中所示

答案 1 :(得分:0)

你的触发器有一些缺陷。

首先,您不需要测试是否因为更新,插入或删除而被触发。触发器被指定用于更新,因此无论如何插入和删除都不会触发它。

其次,每当您更新表格中的多行时,SELECT @Car = A From inserted都会引发错误。

第三,正如你所说,这将在tableB中为每次更新插入一条记录,而你希望它只为第一次更新插入一条记录(我假设一条记录用于任何行的第一次更新,所以如果你更新第1行然后插入,更新第2行然后再插入另一个插入,再次更新第1行不要插入)。

我会这样写:

Create TRIGGER [dbo].[triggerName] ON [dbo].[tableName]
For Update
As
Begin

    INSERT INTO Tableb (c,d,f)
    Select c,d,f 
    from inserted i
    left join Tableb t ON(i.c = t.c and i.d = t.d and i.f = t.f)
    where t.id is null -- or some other non-nullable column
    and i.a = 'BMW'

End