|
我在一个表中有触发器,并且想UserId在插入,更新或删除行时读取值。怎么做?下面的代码不起作用,出现错误UPDATED/ R V& S* R2 l8 ?
ALTER TRIGGER [dbo].[UpdateUserCreditsLeft] 2 `: Q' b% b4 N1 b& r+ Z
ON [dbo].[Order]1 \$ ^9 B O8 s( j _4 W' G
AFTER INSERT,UPDATE,DELETE
! @! s% `& i$ x/ f9 D e' GAS
7 H" B! X: h& V" Z" f9 `BEGIN8 D6 ?0 m# i$ E) ~$ u2 \; e. d5 k
-- SET NOCOUNT ON added to prevent extra result sets from
; v1 {& n5 G1 Y, U9 j -- interfering with SELECT statements., g7 z' c9 }$ H! B- ~ s
SET NOCOUNT ON;3 R# ]8 P4 u1 o H
DECLARE 4 Q0 B7 T* P5 C4 K F2 k. _5 ?
@UserId INT,
' X$ b" V8 W5 ]9 M" l1 e) C' j SELECT @UserId = INSERTED.UserId FROM INSERTED, DELETED0 ~# `. R4 C3 u) F2 K
UPDATE dbo.[User] SET CreditsLeft = CreditsLeft - 1 WHERE Id = @UserId
G9 q( r- x3 O; o" S$ J" KEND
6 F% u3 Y7 @$ w / Y* I; D% a9 z% }$ e, i7 j
解决方案:
* y% U7 H9 a, v9 e* b % ~0 ^ v: b3 A3 m0 ?
4 h/ k: {& E9 x1 b8 e( q& A
3 c. c/ V* b! o S 请注意,其inserted, deleted含义与相同,inserted CROSS JOIN6 C1 K |: U, _* N5 m. W, l$ V
deleted并给出每一行的每种组合。我怀疑这就是你想要的。, E( u4 I( r0 b4 a5 L
这样的事情可能会帮助您入门…+ Y- C- @# B0 l- E
SELECT
0 q/ x% O! ^# g3 n7 [( G CASE WHEN inserted.primaryKey IS NULL THEN 'This is a delete'4 a* O7 r+ s }2 X+ H! d A
WHEN deleted.primaryKey IS NULL THEN 'This is an insert'8 M: O b, _) L' `# N o
ELSE 'This is an update'
1 o* S/ r+ `! ^ END as Action,
0 y5 |" J: e) L7 V( u+ R *7 \- v- l2 H5 v; t' Q
FROM
3 p, L# P5 ^. N' G) @ m" Z inserted; B8 Z1 g: L, O
FULL OUTER JOIN
$ @0 E9 q+ r* \ deleted
1 m+ o `, e+ T6 j8 Q7 M3 I) E ON inserted.primaryKey = deleted.primaryKey# o) N% w' V4 y4 L n9 E9 r% q8 H
然后根据您要执行的操作,使用inserted.userID或引用您感兴趣的表deleted.userID,等等。; x- r! ~4 B @% T
最后,请注意inserted和deleted是 表, 并且可以(并且确实)包含多个记录。
2 u$ ], o; H$ o9 f1 ?" ?& u. X如果您一次插入10条记录,该inserted表将包含所有10条记录。删除和deleted表也??是如此。并且两个表都在更新的情况下。
' |' H5 x: D: O' N& a# [编辑 示例OP编辑后触发。5 Q) j! U) N3 R) X" G6 a* X
ALTER TRIGGER [dbo].[UpdateUserCreditsLeft] % J& v. l, v; k% C/ i: M
ON [dbo].[Order]% F" `: [2 k6 i
AFTER INSERT,UPDATE,DELETE3 N! k" N l$ v* c W
AS
( p, m8 t0 c, |$ o+ @ ABEGIN" u& V" \/ }) {" U' K: Z$ a: @
-- SET NOCOUNT ON added to prevent extra result sets from
. n9 s2 r! t) h- N# }4 N: g$ _' b -- interfering with SELECT statements.
# }& o- A, h1 \/ @" m, ]1 U SET NOCOUNT ON;. C* W- C3 e3 r- f2 A$ X- C
UPDATE, @+ S0 F3 y, J# o& N }
User# [4 _. q3 a9 l( ?
SET
. |# _" h5 u1 }% O, D CreditsLeft = CASE WHEN inserted.UserID IS NULL THEN
" K- W9 i/ p8 h0 ~; A3 a7 s& t1 c WHEN deleted.UserID IS NULL THEN ) |- H2 y/ A) i- i
ELSE 9 j& q# ~" `0 r5 ?( ]8 N
END
8 r# c# z# C! ~3 V# `& Q( N FROM
7 s! V3 P$ N6 n6 \, b User9 |, F% k# W% s# G# a3 R7 e
INNER JOIN
8 d* ` b! Y9 v4 C% b1 ~3 t (; N! Z0 m8 ]; @6 N& H
inserted- d3 x. S/ t4 X# r& x l5 [5 X4 @
FULL OUTER JOIN
* K% h: |2 H" ?. W2 `9 T# S+ F( ` deleted
' n0 G; W; ] w* R7 [$ L) F8 k* z ON inserted.UserID = deleted.UserID -- This assumes UserID is the PK on UpdateUserCreditsLeft
# f7 i+ Y4 y, l/ ^$ P/ W )
+ i4 q3 s) O* N1 T, F3 U# r ON User.UserID = COALESCE(inserted.UserID, deleted.UserID)+ \9 k7 h. W' ?- @' A4 \
END
+ D; @. w! N% S7 [如果的PrimaryKeyUpdateUserCreditsLeft不是UserID,则在FULL OUTER JOIN中使用它。 |
|