2010-06-06 78 views

回答

69

SQL服务器将触发有权访问包含该插入,更新,或导致触发器执行的语句删除各行的第2行“神奇”的表格。

要查找所有插入的行的一个INSERT语句:

select * from inserted 

对于所有在DELETE语句中删除的行:

select * from deleted 

对于UPDATE语句,每行更新会存在于插入和删除的表格中。插入的表将在更新语句之后保存行的新值,并且删除的表将保存更新语句之前的行的旧值。在两张桌子之间加入以获得所需内容:

select i.*, d.* 
from inserted i 
join deleted d on (i.id = d.id) 
+0

+1感谢关于删除和插入表中存在更新行的观点。 – mdma 2010-06-08 11:46:49

+0

尽管我喜欢这个解决方案,但我想指出_if_触发器引用的表没有主键,'update'语句将不会有用:( – 2017-07-25 12:37:48

+0

只要有一些方法在两个表之间进行有意义的连接(例如通常使用的UPDATE语句的WHERE子句),即使该表没有正式的主键,它也将是有意义的。 – 2017-07-26 07:11:59

1

你所需的特殊触发删除,插入表格。从MSDN:

在DML触发器,插入和删除的表主要用来执行以下步骤: 扩展表之间的参照完整性。 在基础视图的基表中插入或更新数据。 测试错误并根据错误采取措施。 找到数据修改前后表格的状态之间的差异,并根据该差异采取行动。 删除的表在DELETE和UPDATE语句中存储受影响的行的副本。在执行DELETE或UPDATE语句期间,将从触发器表中删除行并将其传输到已删除的表中。删除的表和触发器表通常没有行。 插入的表在INSERT和UPDATE语句中存储受影响的行的副本。在插入或更新事务期间,将新行添加到插入的表和触发器表中。插入表中的行是触发器表中新行的副本。

check here for more info

+0

此链接已死亡。你能更新它吗? – 2016-07-04 14:47:37

+1

@FedericoTraiman,该链接似乎为我工作,想通过msdn链接可能不会死。尽管我已将一些内容添加到答案的正文中。 – 2016-07-05 14:54:12

+0

它现在还活着!谢谢 – 2016-07-06 13:58:08