2

假设我有表 T1 和 T2

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

我需要的是一个触发器,它会在更新 T1 时在 T2 中插入一条记录,我还需要知道旧值和新值,我以前从未使用过触发器,所以任何人都可以帮助我,我该怎么做创建此触发器。是否可能,谢谢。

4

3 回答 3

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更新,所以……</p>

CREATE TRIGGER T1OnUpdate
ON T1
AFTER UPDATE

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

在您的情况下,只有一个声明INSERT,这是显而易见的。不太明显的是我们将如何访问旧值和新值。现在,SQL Server 为您提供了两个虚拟表INSERTEDDELETED,您可以很容易地猜到前者包含所有新值,而后者包含旧值。

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

出于此答案的目的,我将假设PKT2. 然后该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关键字之后的所有内容都被考虑触发器主体的一部分(GO例如,如果您在 SQL Server Management Studio 中运行脚本,则可以放置分隔符以指示语句的结尾)。

有用的阅读:

于 2012-05-18T08:40:25.323 回答
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 将为空,因为没有任何内容被删除。删除触发器上的相同逻辑,INSERTED 将为空

编辑:

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

于 2012-05-18T08:49:42.503 回答
1
create trigger T_UPD_T1
on T1 FOR  update
as
insert into T2 select deleted.value, inserted.value from inserted, deleted 
于 2012-05-18T08:31:25.553 回答