小编典典

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

sql

假设我有表T1和T2

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

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


阅读 255

收藏
2021-04-22

共1个答案

小编典典

好了,您可以使用编写触发器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**
…

现在是时候介绍一下触发器的 主体 了,即实际上应该由触发器执行的语句。您用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关键字之后的所有内容都应被考虑触发器主体的一部分(但是GO,例如,如果您正在SQL
Server Management Studio中运行脚本,则可以放置定界符以指示语句的结尾)。

有用的读物​​:

2021-04-22