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”中插入一个新行?