调用触发器时将行从一个表复制到另一个表

Posted

技术标签:

【中文标题】调用触发器时将行从一个表复制到另一个表【英文标题】:Copying row from one table to another when trigger is called 【发布时间】:2014-02-06 11:42:01 【问题描述】:

我有两张桌子

A)
 Table A
     ID | val | 
1.   1    m
2.   2    n
3.   1    o
4    1    p
5.   2    q


 Table B
    ID | val

所以我有一个要求,当任何行插入到表 A 中时,相同的数据会在表 B 中更新。我正在尝试使用触发器来执行此操作。我的触发器看起来像

CREATE Trigger tr_ForInserts
ON A
FOR INSERT
AS
BEGIN
 SET NOCOUNT ON;
insert into B values(NEW.ID,NEW.Val);
END

我面临的问题是我将如何识别表 A 中的哪一行被插入,因为我有单个 ID 的重复条目。我将如何检测在调用触发器后插入的确切行。查询“插入B值(NEW.ID,New.Val)”中的参数应该是什么.....这些新值应该是什么?

【问题讨论】:

查看这里:codeproject.com/Articles/25600/Triggers-SQL-Server insert into B(ID,Val) select ID,Val from inserted - 但如果它只是第一个表的副本,我会询问为什么第二个表存在。 我和 OP 有同样的问题,在我的情况下,表 A 被用作缓存,并且每晚都会从其中删除一些记录。为了确保我不必关闭整个服务以确保没有记录被删除而不出现在表 B 中,这似乎是最合乎逻辑的答案。 【参考方案1】:
CREATE Trigger tr_ForInserts
ON A
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;
    declare @id int;
    declare @val int;
    select @id=i.ID from inserted i;    
    select @val =i.Val from inserted i;
    insert into B values(@id, @val);
END

【讨论】:

你的触发器坏了。 inserted 可以包含 0、1 或 多个 行。【参考方案2】:
CREATE TRIGGER tg_insert ON A
FOR INSERT
AS
BEGIN
  INSERT B
  SELECT id, val
  FROM inserted
END

【讨论】:

以上是关于调用触发器时将行从一个表复制到另一个表的主要内容,如果未能解决你的问题,请参考以下文章

将行从一个表复制到另一个表

使用 INSERT 查询将行从一个表复制到另一个表 [关闭]

将行从一个表复制到另一个表时如何解决数据截断错误,两个表具有相同的模式?

如何将行从一个 Excel 工作表复制到另一个工作表并使用 VBA 创建重复项?

将行从一个选项卡复制并删除到另一个选项卡

如何将行从一个 MySQL 数据库复制到另一个