调用触发器时将行从一个表复制到另一个表
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-Serverinsert 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 查询将行从一个表复制到另一个表 [关闭]
将行从一个表复制到另一个表时如何解决数据截断错误,两个表具有相同的模式?