创建一个触发器,该触发器将在另一个表更新时在一个表中插入记录
技术问答
229 人阅读
|
0 人回复
|
2023-09-13
|
假设我有表T1和T22 x: C0 [3 G! a* ~$ G, O4 V
Columns of T1 -->Value# W; ?" b% A5 X! l) |
Columns of T2 -->OldValue NewValue; P! x- S9 X( S/ ^
我需要的是一个触发器,该触发器将在T1更新时在T2中插入一条记录,我也需要知道旧值和新值,我以前从未使用过触发器,所以有什么可以帮助我的,我该怎么做创建此触发器。是否有可能,谢谢。, x# `0 q, Z- \8 `7 G* u
/ n3 ?! l$ C, i0 x! q
解决方案:
, U$ N$ j) Z% v6 [9 h4 n9 p W; z + l1 b, T$ i5 k* u5 D k/ M9 X0 l
" g/ f* R) E4 i( r, u( @/ u
; N3 X# |! X/ Q
好了,您可以使用编写触发器CREATE TRIGGER:" A. r& p/ h" ?
CREATE TRIGGER **NameOfTheTriggerPlease**
3 q0 x; G6 U, g2 k l) ^- E…
3 ~4 ^6 n* I5 u0 X% j应该触发该附加操作的表是,T1因此应该ON将该表定义为触发器:( O4 P7 j! p) p% O. U& b1 `
CREATE TRIGGER T1OnUpdate /* that's just an example,( b" X: a' x5 R% x4 h; J
you can use a different name */$ w$ |# k8 h5 e) r0 H* [
**ON T1**1 n" h3 K# }/ h: D2 K
…8 ?( J2 {% a& }5 E0 _3 W
触发器应该在其上被调用的动作是时间UPDATE,而定时是AFTER更新,所以…
. o: \/ u. L5 e" C4 f, o7 kCREATE TRIGGER T1OnUpdate9 A' ]! o u1 i
ON T1
( d7 Y' M+ O' F- N. N**AFTER UPDATE**
6 V7 K, `. Z7 m" t1 f…5 N9 X$ `4 w. M2 @+ j: R
现在是时候介绍一下触发器的 主体 了,即实际上应该由触发器执行的语句。您用AS关键字和后面的语句本身介绍正文。, T6 e) E; V" q
在您的情况下,将只有一个语句INSERT,这是显而易见的。不太明显的是我们将如何访问旧值和新值。现在,SQL
! J3 v2 Q7 B5 `, k U, `! F3 AServer为您提供了两个虚拟表INSERTED和DELETED,您可以轻松地猜测前者包含所有新值,而后者包含旧值。+ m3 e( }) o6 x# ~% i1 Z. Z
这些表与触发器分配给的表具有相同的结构,即T1。它们仅包含受UPDATE调用触发器的特定语句影响的行,这意味着可能存在多个行。相应地,这意味着您需要在表中具有一些主键或唯一列(或一组列)T1,您可以在触发器中使用它来匹配已删除和已插入的行。(实际上,您可能还需要在T2表中包含一个引用T1的主键的列,以便以后可以确定在哪个行中T1存储了哪些值T2。)* U% z+ w5 N' T( G* p
出于此答案的目的,我将假定在中有一个名为的主键列PK和一个同名的外键列T2。然后,该INSERT语句可能如下所示:
; m2 o, Z9 `/ e: {$ M, RCREATE TRIGGER T1OnUpdate
5 q, N( w0 |/ p7 |# x, }, QON T1' o' q& v5 i+ F; e9 I! M
AFTER UPDATE! T; m3 o4 [# ^6 R& H4 z' _" b
AS! ^* R; \2 z- y- ~
**INSERT INTO T2 (PK, OldValue, NewValue)
3 l. j) i) k- r' w2 KSELECT i.PK, i.Value, d.Value
. q" F0 N3 v" A' kFROM INSERTED i INNER JOIN DELETED d ON i.PK = d.PK**
% W1 n5 E2 e2 D6 W最后(但并非最不重要)要记住的一件事:整个CREATE TRIGGER语句应该是批处理中的唯一语句,即,在CREATE
* b5 g: \/ _2 P# N- W& U3 R+ K5 W' ~TRIGGER关键字之前不应有任何语句(但是您可以在其中添加注释),同样,AS关键字之后的所有内容都应被考虑触发器主体的一部分(但是GO,例如,如果您正在SQL
3 n3 _3 u& N6 `+ _Server Management Studio中运行脚本,则可以放置定界符以指示语句的结尾)。3 H( g9 q* s! l! n- B" H" j) ?
有用的读物??:
5 {0 f: m7 k9 h; \" ]4 L+ o创建触发器(Transact-SQL)) O' J a1 O2 d3 }$ z
|
|
|
|
|
|