创建一个触发器,在更新行时将旧值插入其他表
Posted
技术标签:
【中文标题】创建一个触发器,在更新行时将旧值插入其他表【英文标题】:Create a trigger that inserts old values into other table when a row is updated 【发布时间】:2015-03-10 06:34:30 【问题描述】:我正在尝试在 SQL Server 数据库上实现一个触发器,只要在 table1
中更新一行,它就会在 table2
中插入一个新行。我想在更新前获取行数据(table1
)。
例如,我有以下几行:
table1: table2:
________________________ ________________________
| id | name | | id | name |
________________________ ________________________
| 1 | John |
------------------------
目前我正在使用以下触发器-
CREATE TRIGGER triggername
ON table1
FOR UPDATE
AS
Begin
INSERT INTO table2(name)
SELECT i.name
FROM Inserted i
End
此触发器正在执行以下操作 -
table1: table2:
________________________ ________________________
| id | name | | id | name |
________________________ ________________________
| 1 | Alex | | 1 | Alex |
------------------------ ------------------------
但我想要 table2 中的“John”。比如table1和table2现在应该如下-
table1: table2:
________________________ ________________________
| id | name | | id | name |
________________________ ________________________
| 1 | Alex | | 1 | John |
------------------------ ------------------------
我该怎么做?
【问题讨论】:
【参考方案1】:您需要在触发器中使用Deleted
伪表,其中包含旧 值(在UPDATE
之前):
CREATE TRIGGER triggername
ON table1
FOR UPDATE
AS
Begin
INSERT INTO table2(name)
SELECT d.name
FROM Deleted d
End
Inserted
伪表包含 新 值 - 在 UPDATE
之后。
【讨论】:
【参考方案2】:这只会返回新值:
INSERT INTO table2(name)
SELECT i.name
FROM Inserted i
然而,这将返回更新前的值
INSERT INTO table2(name)
select d.name
from inserted i
join deleted d
on (i.id = d.id)
【讨论】:
【参考方案3】:使用以下-
Begin
INSERT INTO table2(name)
SELECT d.name
FROM Deleted d
End
【讨论】:
以上是关于创建一个触发器,在更新行时将旧值插入其他表的主要内容,如果未能解决你的问题,请参考以下文章