在SQL更新触发器中捕获已修改的行

时间:2017-03-08 08:46:06

标签: sql-server triggers

如何在更新触发器中捕获已修改的行以将它们插入到其他表中?

3 个答案:

答案 0 :(得分:2)

在SQL Server中,我们只有两个可以在触发器内使用的虚拟表,它们是“INSERTED”和“DELETED”。例如:

插入操作:当您插入新记录时“INSERTED”虚拟表包含新插入的记录,其中“DELETED”虚拟保持为空。

更新操作:更新任何记录时,首先将旧记录放入“已删除”虚拟表中,并通过“INSERTED”虚拟表保留新更新的记录。

这意味着您可以通过“INSERTED”虚拟表从“DELETED”和当前更新的值中获取旧值。你可以查询它们:

  -- To get the old record value

SELECT * FROM DELETED

-- To get the updated value

SELECT * FROM INSERTED

删除操作:删除任何特定记录时,已删除的记录将插入“已删除”虚拟表中。

  1. SELECT * FROM UPDATED - 提供错误。

  2. 试试这个:

    DECLARE @OldVal int,@ NewVal int
    SELECT @OldVal = Col FROM DELETED
    SELECT @NewVal = Col FROM INSERTED

  3. 通过保存旧值和新值,您可以比较它们的状态。

答案 1 :(得分:1)

使用inserted表 这是一个非常基本的例子:

CREATE TRIGGER <name> ON <table> FOR UPDATE
AS

INSERT INTO <otherTable> (<Columns>)
SELECT <Columns>
FROM Inserted

GO

答案 2 :(得分:0)

要在“ MyTable1”中更新列“名称”时更改“ MyTable2”中的列“名称”,请尝试类似的操作。

CREATE TRIGGER tr_test ON MyTable1
AFTER INSERT,UPDATE,DELETE
AS

update x set name = dsi.name
from deleted as ds
        inner join inserted as dsi on dsi.id = ds.Id and dsi.name is not null and 
ltrim(dsi.name) != '' and rtrim(ltrim(isnull(ds.name, '') )) != rtrim(ltrim(isnull(dsi.name, '') ))
    inner join MyTeble2 as x on x.name = ds.name
where ds.name is not null and ltrim(ds.name) != ''