回答

收藏

如何调试T-SQL触发器?

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

我有一个表t,它具有一个称为trgInsAfter的“插入后”触发器。究竟该如何调试?我对此不是专家,所以问题和执行的步骤可能看起来很愚蠢。
5 P$ _5 m. }- q% V到目前为止,我执行的步骤是:1.连接到server instanceVia SSMS(使用Windows Admin帐户)
# A0 {+ F7 T- D6 B/ b. N1 s[ol]; ^! D6 t$ \, M$ W; l* y0 |
右键单击SSMS中左侧树中的触发器节点,然后双击以将其打开,触发器的代码将在新查询窗口(称为Window-1)中打开,如下所示:blah ...., * B* z8 P0 \- B& `, F
ALTER TRIGGER trgInsAfter AS .... BEGIN ... END7 ~. O) e6 z8 Q
: E: u- Y; C" Y
打开另一个查询窗口(称为Window-2),输入sql将一行插入表t中:5 u# k& I+ O& L
insert t(c1,c2) values(1,'aaa')4 \( P  y# v; Y

* U0 W! {' |6 `在Window-1中设置一个断点(在触发器的代码中)
; f8 [1 J/ U' ^: p1 l: A/ H/ j& d+ S" j8 a' d+ \! P6 j4 Y
在Window-2中设置一个断点(插入SQL代码)
4 g5 I1 u8 D, j# V2 [8 k5 r  n$ s( H
在Window-2是当前窗口的情况下,单击工具栏上的“调试”按钮
  V6 l/ C4 t* _: r. @1 N2 D
- T! |% ]  |/ T  F6 ^[/ol]
: Q2 K) [$ z* r' g  a+ D* D插入SQL代码的断点被命中,但是当我查看Window-1时,触发器代码中的断点有一个工具提示,说 'unable to bind SQL1 ^+ m5 \/ {0 l8 u1 V
breakpoint, object containing the breakpoint not loaded'
; K/ G4 d# `1 E( E6 |: u, S: b% q我可以理解一个问题:如何SSMS知道Window-1中的代码是触发器
+ ^3 }; c: y5 b/ y1 V6 Q我要调试吗?我看不到要告诉SSMS的地方,“嘿,此查询编辑器中的代码是表t的插入触发器的代码”: w% Z: B0 v6 l, Q8 f
有什么建议?. [3 _" w& b, ]" D* |+ @
谢谢  l$ l0 {. J5 b* q1 c2 \, N
                / S! V" F* G& d0 {! B  Q  D
解决方案:
6 k, o1 O: h3 X; ]7 ]! w               
& S  s2 p9 `' Y
; n4 A9 ?% d2 s; s2 B# h4 K5 V) n. D+ ~9 d5 F* c0 ^$ V
                您实际上对此考虑过度。
7 h; h, I& `' g我首先在一个窗口中运行此查询(以进行设置):& i( h! C; e8 P# J2 f
create table X(ID int not null)
3 q' q* r0 s4 U6 Screate table Y(ID int not null)3 n3 u9 {; B! Z8 n$ I
go; E2 j/ m' V' S
create trigger T_X on X
3 ?6 O" D/ g2 S- T0 J) S4 r* U6 bafter insert
) o) |4 A; s) q6 Y, Ias. ^1 H# H2 D, O
    insert into Y(ID) select inserted.ID
6 g6 K2 k4 A5 ?go; s5 G7 ^& m3 G6 e# ^4 s5 G3 B. x/ q! `' t
然后,我可以丢弃该窗口。我打开一个新的查询窗口,写:% l% W3 X& |' |7 x# E
insert into X(ID) values (1),(2)
7 D8 n2 f5 N+ ^* Z! d并在该行上设置一个断点。然后,我 启动
( P& K: ~" t$ }+ E) r4 b调试器(Debug从菜单或工具栏或Alt-F5)并等待(有一阵子,调试器从未如此之快)以使其达到该断点。然后,在那儿打了,我选择了Step
) h8 {. `# y2 k/ Z% J; g0 b- e; WInto(F11)。然后(再次等待一会儿)打开了一个新窗口,这是我的触发器,调试器停止的下一行代码是insert into/ o' q& @% r7 J: l
Y...触发器中的行。现在,我可以在触发器中设置任何其他断点。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则