假设我有表 T1 和 T2
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
我需要的是一个触发器,它会在更新 T1 时在 T2 中插入一条记录,我还需要知道旧值和新值,我以前从未使用过触发器,所以任何人都可以帮助我,我该怎么做创建此触发器。是否可能,谢谢。
假设我有表 T1 和 T2
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
我需要的是一个触发器,它会在更新 T1 时在 T2 中插入一条记录,我还需要知道旧值和新值,我以前从未使用过触发器,所以任何人都可以帮助我,我该怎么做创建此触发器。是否可能,谢谢。
好吧,您开始编写触发器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 为您提供了两个虚拟表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
关键字之后的所有内容都被考虑触发器主体的一部分(GO
例如,如果您在 SQL Server Management Studio 中运行脚本,则可以放置分隔符以指示语句的结尾)。
有用的阅读:
我不会为你构建整个东西(没有乐趣,对吧?)但我可以为你指出正确的方向
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 上的值都相同
create trigger T_UPD_T1
on T1 FOR update
as
insert into T2 select deleted.value, inserted.value from inserted, deleted