好了,您可以使用编写触发器
CREATE TRIGGER:
CREATE TRIGGER **NameOfTheTriggerPlease**…
应该触发该附加操作的表是,
T1因此应该
ON将该表定义为触发器:
CREATE TRIGGER T1OnUpdate **ON T1**…
触发器应该在其上被调用的动作是时间
UPDATE,而定时是
AFTER更新,所以…
CREATE TRIGGER T1onUpdateON T1**AFTER UPDATE**…
现在是时候介绍一下触发器的 主体 了,即实际上应该由触发器执行的语句。您用
AS关键字和后面的语句本身介绍正文。
在您的情况下,将只有一个语句
INSERT,这是显而易见的。不太明显的是我们将如何访问旧值和新值。现在,SQL
Server为您提供了两个虚拟表
INSERTED和
DELETED,您可以轻松地猜测前者包含所有新值,而后者包含旧值。
这些表与触发器分配给的表具有相同的结构,即
T1。它们仅包含受
UPDATE调用触发器的特定语句影响的行,这意味着可能存在多个行。相应地,这意味着您需要在表中具有一些主键或唯一列(或一组列)
T1,您可以在触发器中使用它来匹配已删除和已插入的行。(实际上,您可能还需要在
T2表中包含一个引用
T1的主键的列,以便以后可以确定在哪个行中
T1存储了哪些值
T2。)
出于此答案的目的,我将假定在中有一个名为的主键列
PK和一个同名的外键列
T2。然后,该
INSERT语句可能如下所示:
CREATE TRIGGER T1onUpdateON T1AFTER UPDATEAS**INSERT INTO T2 (PK, OldValue, NewValue)SELECT i.PK, i.Value, d.ValueFROM INSERTED i INNER JOIN DELETED d ON i.PK = d.PK**
最后(但并非最不重要)要记住的一件事:整个
CREATE TRIGGER语句应该是批处理中的唯一语句,即,在
CREATETRIGGER关键字之前不应有任何语句(但是您可以在其中添加注释),同样,
AS关键字之后的所有内容都应被考虑触发器主体的一部分(但是
GO,例如,如果您正在SQL
Server Management Studio中运行脚本,则可以放置定界符以指示语句的结尾)。
有用的读物:
- 创建触发器(Transact-SQL)



