使用

Inserted和Deleted表

我们这里介绍两个特殊的表，Inserted表和Deleted表。此二表仅仅在触发器运行时存在。你可以使用该两个表来精确地确定触发触发器的动作对数据表所做的修改。比如，通过检查Deleted表，你可以确定那些记录由某一动作删除。考虑下面的例子：

CREATE TRIGGER tr_webusers_delete ON webusers

FOR DELETE

AS

INSERT weblog (activity) SELECT user_name FROM Deleted

该触发器自动地创建一个webusers表的记录。当在webusers表内删除一个用户的姓名时，触发器会自动地把该姓名插入到weblog表中。假设你一不小心执行了下面的语句：

DELETE webusers

该语句会删除在webusers表内的所有记录。一般地，这些记录会永久地丢失，然而上面的触发器会在有记录从webusers表中删除时自动的触发。该触发器会检查表Deleted来确定有那些在webusers表内的记录被删除，并且把所有删除了的记录拷贝到weblog表中。

为了恢复那些意外被删除的记录，你可以使用INSERT和SELECT语句再一次把它们从weblog表中拷贝到webusers表中。如果你不能允许意外地丢失一条记录时，你可以使用上面的方法来创建一个表内数据的备份。

Deleted表和有记录被删除的表的列结构一模一样。在前面的例子内，Deleted表具有和webusers表相同的结构。

现在假定你想跟踪所有插入某一表格的记录。比如，你想把每一条插入webusers表内的记录都在weblog表内做备份，你可以使用下面的触发器来完成该任务：

CREATE TRIGGER tr_webusers_insert ON webusers

FOR INSERT

AS

INSERT weblog(activty) SELECT user_name FROM INSERTED

该触发器和前面的触发器非常相似，除了以下两点以外：

> 该触发器在有记录插入表格webusers时触发；该触发器是FOR INSERT。

> 该触发器把记录从Inserted表拷贝到weblog表内。

Inserted表内包含了所有已经插入到表内的新记录。假如一个新用户的姓名插入到webusers表内时，触发器会自动地把新的用户姓名从webusers表拷贝到weblog表内。

当你想使用一个简单的表来记录所有发生在你数据库中一个非常重要的表的动作时，这种复制数据的方法非常有用。你可以使用该表来获得对你的数据库的活动的记录，并且可以用于记录和诊断一些可能发生的问题。

你同样可以使用Inserted表和Deleted表来记录UPDATE对触发器所在的表所做的改动。当一个和触发器相关的表内的数据被修改时，Deleted表包含了所有列在修改之前的值，而Inserted表包含了所有列在修改之后的值。参看下面的表12.2，以明确每一个动作是如何影响Deleted和Inserted表的。

表12.2.Inserted和Deleted表的内容

表 | INSERT | DELETE | UPDATE
Inserted | 插入列 | 空 | 修改前的列
Deleted | 空 | 删除列 | 修改后的列

Inserted表和Deleted表仅仅在触发器在执行时存在，这一点是非常重要的，我们一定要明确。它们在某一特定时间和某一特定表相关。一旦某一个触发器结束执行时，相应的在两个表内的数据都会丢失。如果你想创建一个在任意一个这些表内数据的永久拷贝，你需要在触发器内把这些表内的数据拷贝到一个永久的表内。