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

标签 sql sql-server-2008 triggers

假设我有表 T1 和 T2

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

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

最佳答案

那么,您开始使用 CREATE TRIGGER 编写触发器:

CREATE TRIGGER <b>NameOfTheTriggerPlease</b>
…

应触发附加操作的表是 T1所以应该定义触发器 ON那张 table :

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

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

CREATE TRIGGER T1OnUpdate
ON T1
<b>AFTER UPDATE</b>
…

现在是介绍触发器的主体的时候了,即应该由触发器实际执行的语句。你用AS介绍 body 关键字后跟语句本身。

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

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

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

CREATE TRIGGER T1OnUpdate
ON T1
AFTER UPDATE
AS
<b>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</b>

最后(但并非最不重要)的事情要记住:整个 CREATE TRIGGER语句应该是批处理中唯一的一个,即 CREATE TRIGGER 之前不应有语句关键字(但您可以在此处添加注释)以及 AS 之后的所有内容关键字被视为触发器正文的一部分(但是,如果您在 SQL Server Management Studio 中运行脚本,则可以放置 GO 分隔符来指示语句的结尾)。

有用的阅读:

关于sql - 创建一个触发器,它将在更新另一个表时将记录插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10648983/

相关文章:

sql-server - TDE 启用对数据库性能有何影响?

mysql - 插入后在mysql中触发

mysql - 从调用触发器的插入中检索值

sql - rowsBetween 和 rangeBetween 有什么区别?

mysql - 在存储过程中迭代选择查询

sql - SQL Server 2008 是否支持 CREATE ASSERTION 语法?

c# - 使用 Linq-to-SQL 添加多条记录

python - JSON 的结构化查询语言(在 Python 中)

sql - DATEADD MS -1 不执行任何操作

java - 如何使用 cassandra 触发器执行删除操作?