Pri*_*tel 2 sql triggers sql-server-2008
假设我有T1和T2表
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
Run Code Online (Sandbox Code Playgroud)
我需要的是一个触发器,它会在T2上更新T1时插入一条记录,我也需要知道旧值和新值,我之前从未使用过触发器,所以可以帮我这个,我怎么去创建这个触发器.是的,谢谢.
好吧,你开始编写一个触发器CREATE TRIGGER:
CREATE TRIGGER NameOfTheTriggerPlease
…
Run Code Online (Sandbox Code Playgroud)
应该触发附加操作的表是T1这样的触发器应该定义ON为表:
CREATE TRIGGER T1OnUpdate /* that's just an example,
you can use a different name */
ON T1
…
Run Code Online (Sandbox Code Playgroud)
应该调用触发器的操作是UPDATE,时间是AFTER更新,所以......
CREATE TRIGGER T1OnUpdate
ON T1
AFTER UPDATE
…
Run Code Online (Sandbox Code Playgroud)
现在是时候介绍触发器的主体,即触发器实际应该执行的语句.您将使用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
Run Code Online (Sandbox Code Playgroud)
要记住的最后一个(但并非最不重要的)事情:整个CREATE TRIGGER语句应该是批处理中唯一的一个,即CREATE TRIGGER关键字之前不应该有语句(但你可以在那里放置注释),同样地,AS考虑关键字之后的所有内容触发器主体的一部分(例如GO,如果在SQL Server Management Studio中运行脚本,则可以使用分隔符指示语句的结尾).
有用的阅读: