创建一个触发器,它将在更新另一个表时在表中插入记录

时间:2012-05-18 08:06:27

标签: sql sql-server-2008 triggers

假设我有表T1和T2

Columns of T1 -->Value
Columns of T2 -->OldValue NewValue

我需要的是一个触发器,它会在T2上更新T1时插入一条记录,我也需要知道旧值和新值,我之前从未使用过触发器,所以可以帮我这个,怎么做我开始创建这个触发器。这是可能的,谢谢。

3 个答案:

答案 0 :(得分:6)

好吧,你开始用CREATE TRIGGER编写一个触发器:

CREATE TRIGGER NameOfTheTriggerPlease

应该触发附加操作的表是T1,因此应该定义触发器ON表:

CREATE TRIGGER T1OnUpdate  /* that's just an example,
                              you can use a different name */
ON T1

应该调用触发器的操作是UPDATE,更新的时间是AFTER,所以......

CREATE TRIGGER T1OnUpdate
ON T1
AFTER UPDATE

现在是时候介绍触发器的 body ,即应该由触发器实际执行的语句。您使用AS关键字引入正文,然后是语句本身。

在您的情况下,只有一个声明INSERT,这很明显。什么不那么明显是我们将如何访问旧的和新的价值观。现在,SQL Server为您提供了两个虚拟表INSERTEDDELETED,您可以轻松猜测前者包含所有新值,后者包含旧值。

这些表与分配触发器的表具有相同的结构,即T1。它们只包含受调用触发器的特定UPDATE语句影响的行,这意味着可能有多个行。反过来,这意味着您需要在T1表中包含一些主键或唯一列(或一组列),您可以在触发器中使用它们来匹配已删除和插入的行。 (实际上,您可能还需要T2表来创建一个引用T1主键的列,以便稍后确定哪一行T1具有哪些值存储在T2中。)

出于本答案的目的,我将假设在PK中有一个名为T2的主键列和一个同名的外键列。然后INSERT语句可能如下所示:

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关键字之后的所有内容都被视为触发器主体的一部分(但是如果在SQL中运行脚本,则可以使用GO分隔符来指示语句的结尾例如,Server Management Studio。)。

有用的阅读:

答案 1 :(得分:2)

我不会为你建造整件事(没有乐趣,对吧?)但是我可以指出你正确的方向

create trigger logUpdate
on T1
After update
as
begin
  insert into T2...
  --here is just an example
  select * from deleted --the DELETED table contains the OLD values
  select * from inserted  --the INSERTED table contains the NEW values
end

请记住,DELETED和INSERTED是包含旧值和新值的内部表。在更新触发器上,它们都存在。在插入触发器上,DELETED将为null,因为没有任何删除。删除触发器上的逻辑相同,INSERTED将为空

编辑:

回答你的问题:无论你更新多少个字段,你的DELETED和INSERTED表都包含受影响的所有行的所有列。当然,如果只更新一列,则所有其他列在DELETED和INSERTED上具有相同的值

答案 2 :(得分:1)

create trigger T_UPD_T1
on T1 FOR  update
as
insert into T2 select deleted.value, inserted.value from inserted, deleted