好吧,你开始编写一个触发器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
…
现在是时候介绍一下body触发器的,即触发器实际应该执行的语句。你介绍身体AS
关键字后跟语句本身。
在你的情况下,只有一个声明,INSERT
,这是显而易见的。不那么明显的是我们将如何访问旧的和新的价值观。现在,SQL Server 为您提供两个虚拟表,INSERTED
and 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 中运行脚本,则指示语句结束的分隔符)。
有用的阅读:
- 创建触发器 (Transact-SQL) http://msdn.microsoft.com/en-us/library/ms189799.aspx