捕获T-SQL中的更新行

时间:2014-07-22 21:25:48

标签: sql-server tsql

我不经常编写T-SQL代码,那么如何在触发器中捕获更新的行? 如果我为INSERT创建触发器,我可以在<{p}}中请求来自inserted的记录

Create Trigger [dbo].[tr_test]
on table1
for INSERT
as

declare @id int
select @id = i.RecordId from inserted as I
...

我如何为UPDATE做到这一点?

2 个答案:

答案 0 :(得分:4)

在sql server中有两个触发器或魔术表插入或删除表。

如果您要为插入创建触发器 - 数据仅在已删除的表中插入表中,没有记录查找

Create Trigger [dbo].[tr_test]
on table1
for INSERT
as
if exists (select 1 from inserted) and not exists(select 1 from deleted)
-- Action which would you want For Insert

如果您要为更新创建触发器 - 更新的数据仅在插入的表中,而以前的数据在删除的表中没有找到记录

Create Trigger [dbo].[tr_test]
on table1
for UPDATE
as
if exists (select 1 from inserted) and  exists(select 1 from deleted)
-- Action which would you want when your target table has been update

如果您要为删除创建触发器 - 已删除的数据包含在已删除的表格中,如果删除数据,则不会插入表格。

Create Trigger [dbo].[tr_test]
on table1
after  Delete
as
if exists (select 1 from deleted ) and not exists(select 1 from inserted)
-- Action which would you want when your target table has been delete

答案 1 :(得分:2)

与插入触发器相同。在更新触发器中,inserted包含新值,deleted包含旧值。

说文档:

  

删除的表在DELETE和UPDATE语句期间存储受影响行的副本。在执行DELETE或UPDATE语句期间,将从触发器表中删除行并将其传送到已删除的表。删除的表和触发器表通常没有共同的行。

     

inserted表在INSERT和UPDATE语句期间存储受影响行的副本。在插入或更新事务期间,新行将添加到插入的表和触发器表中。插入表中的行是触发器表中新行的副本。

     

更新事务类似于删除操作,后跟插入操作;首先将旧行复制到已删除的表中,然后将新行复制到触发器表和插入的表中。

来源:DML Triggers, Use the inserted and deleted Tables