创建一个触发器,在更新行时将旧值插入其他表

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

【讨论】:

以上是关于创建一个触发器,在更新行时将旧值插入其他表的主要内容,如果未能解决你的问题,请参考以下文章

触发插入旧值

半计算列只能在插入触发器后使用?

如果在更新触发之前未在 oracle 中进行更新,则新值与旧值相同

触发器

创建触发器以在更新表之后插入

插入更新另一个表后创建触发器