回答

收藏

如何调试T-SQL触发器?

技术问答 技术问答 349 人阅读 | 0 人回复 | 2023-09-14

我有一个表t,它具有一个称为trgInsAfter的“插入后”触发器。究竟该如何调试?我对此不是专家,所以问题和执行的步骤可能看起来很愚蠢。) s4 o) T6 O0 ^: w" N+ J
到目前为止,我执行的步骤是:1.连接到server instanceVia SSMS(使用Windows Admin帐户)
8 I( j5 B  I* g1 |[ol]
: q5 |8 N& d, X& B' S; u右键单击SSMS中左侧树中的触发器节点,然后双击以将其打开,触发器的代码将在新查询窗口(称为Window-1)中打开,如下所示:blah ....,
& A8 ^0 k3 V& ?! ?! n; D: p; N" KALTER TRIGGER trgInsAfter AS .... BEGIN ... END
' N& q+ G  Q0 a/ |
2 G* Q* A  J; G" q) o& i打开另一个查询窗口(称为Window-2),输入sql将一行插入表t中:) e2 `# A- I0 V# E- V$ @
insert t(c1,c2) values(1,'aaa')
( }$ e3 H& h% J. C% E0 y& q: O) K  R+ @: t0 b6 g  G
在Window-1中设置一个断点(在触发器的代码中)
) L+ x( h& }2 z
7 \2 j) u) L3 H/ M% J在Window-2中设置一个断点(插入SQL代码)  p2 s4 {6 {* U" t

" B3 c1 q* U' ?6 I  X8 E0 q, M在Window-2是当前窗口的情况下,单击工具栏上的“调试”按钮' {3 [) [5 M) W3 ~, \! R3 Z; ]8 ?
. m8 w+ I) E7 ~9 T' S. F/ B  g
[/ol]
" e5 ?$ ]7 y5 d: z) }插入SQL代码的断点被命中,但是当我查看Window-1时,触发器代码中的断点有一个工具提示,说 'unable to bind SQL
: a% a3 H! p2 h6 }, Hbreakpoint, object containing the breakpoint not loaded'3 G/ x$ J2 b, z2 r# G$ c) m( J1 F
我可以理解一个问题:如何SSMS知道Window-1中的代码是触发器. x! @, D$ s+ M; I# Z! Z/ b
我要调试吗?我看不到要告诉SSMS的地方,“嘿,此查询编辑器中的代码是表t的插入触发器的代码”
: d3 h  c5 L( N有什么建议?
( r, G) a* y) \' k/ W谢谢
) a" [# L# g, U! E' z                8 P; }$ v3 d! {9 a- q9 b
解决方案:8 D, s+ ^; a2 {. S  S6 p. y
                4 t( d9 w5 X3 x% y" O* N( V2 _2 Y  c
/ q+ T5 R9 O8 q3 @3 K; r* L

6 j0 Y0 E: a, F( n                您实际上对此考虑过度。
7 V4 f% k, X3 d% T: ~1 C0 _3 l我首先在一个窗口中运行此查询(以进行设置):
' j, C% d$ _0 f9 p) J! @create table X(ID int not null)
- p2 I+ g& W0 l2 A9 I. x1 ~create table Y(ID int not null)0 J% b* }7 c4 y# {! V4 W
go# ^- k: i8 K% v# a8 T# I
create trigger T_X on X
3 Y' |8 A3 B# x! a# v8 e+ eafter insert# ~$ `( [% Y& c- {
as' W1 U, q$ _; G- k8 a3 o5 ?
    insert into Y(ID) select inserted.ID
* p' D7 p" G: V9 @0 Ego
- ?' ^  q& e1 S9 j% k# ^然后,我可以丢弃该窗口。我打开一个新的查询窗口,写:
$ |* k6 m- ]( g% w) M7 Yinsert into X(ID) values (1),(2)
; ^+ P7 r2 g- q: R并在该行上设置一个断点。然后,我 启动0 w5 I5 H& w; U# G8 T( w
调试器(Debug从菜单或工具栏或Alt-F5)并等待(有一阵子,调试器从未如此之快)以使其达到该断点。然后,在那儿打了,我选择了Step! r8 _7 s8 o+ R1 A0 ]: K  @
Into(F11)。然后(再次等待一会儿)打开了一个新窗口,这是我的触发器,调试器停止的下一行代码是insert into: r1 E' \( O  A- Z* l8 o
Y...触发器中的行。现在,我可以在触发器中设置任何其他断点。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则