如何在更新触发器中捕获已修改的行以将它们插入到其他表中?
答案 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
删除操作:删除任何特定记录时,已删除的记录将插入“已删除”虚拟表中。
SELECT * FROM UPDATED
- 提供错误。
试试这个:
DECLARE @OldVal int,@ NewVal int
SELECT @OldVal = Col FROM DELETED
SELECT @NewVal = Col FROM INSERTED
通过保存旧值和新值,您可以比较它们的状态。
答案 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) != ''