假设我有表T1和T2
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
我需要的是一个触发器,它会在T2上更新T1时插入一条记录,我也需要知道旧值和新值,我之前从未使用过触发器,所以可以帮我这个,怎么做我开始创建这个触发器。这是可能的,谢谢。
答案 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为您提供了两个虚拟表INSERTED
和DELETED
,您可以轻松猜测前者包含所有新值,后者包含旧值。
这些表与分配触发器的表具有相同的结构,即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