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