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

Posted

技术标签:

【中文标题】Sql 触发器在表更新时添加新行【英文标题】:Sql Trigger to add new row when table update 【发布时间】:2016-05-10 13:39:06 【问题描述】:

我是 sql 触发器的新手,并且正在学习为 asp.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

【问题讨论】:

请阅读How to Ask。显示您的代码。 您确定要为此创建触发器吗?据我了解,一旦将一行添加到表 B,触发器就会过时。您可能需要重新考虑您的数据库设置/设计。 @zohar 我已添加代码以供审核 @Ralph 我没有想到任何其他方式可能是因为我的知识有限,因为我正在使用触发器来响应表 A 中的更新,这在表 b 中创建了一行。我不知道是什么正确的方式。请指导 您应该(至少)设置一项日常工作,以删除所有超过其使用寿命的触发器(例如这个)。 【参考方案1】:

你的触发器有一些缺陷。

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

其次,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

【讨论】:

感谢 Zohar 的帮助和分享您的知识。我只是接受它作为答案。【参考方案2】:

您可以修改 SQL 触发器,使其仅在 INSERT 之后执行

CREATE TRIGGER dbo.myTable_Insert
 ON dbo.myTable
AFTER INSERT
AS

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

【讨论】:

对不起,我已经添加了我的代码。我正在使用更新触发器来添加新行。

以上是关于Sql 触发器在表更新时添加新行的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?

数据库补充知识之sql编程

触发器

如何编写一个触发器来检查一个值是不是已经在表中?

SQL Server2008 触发器中,根据一个表修改另外一个表

如何使用触发器在同一张表中插入新行(Oracle PL/SQL 10G)?