回答

收藏

如何调试T-SQL触发器?

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

我有一个表t,它具有一个称为trgInsAfter的“插入后”触发器。究竟该如何调试?我对此不是专家,所以问题和执行的步骤可能看起来很愚蠢。& W! U9 g- r, ~; m
到目前为止,我执行的步骤是:1.连接到server instanceVia SSMS(使用Windows Admin帐户): X0 x' |' e! u1 P1 P4 |$ T
[ol]
! \* {, m3 y# S右键单击SSMS中左侧树中的触发器节点,然后双击以将其打开,触发器的代码将在新查询窗口(称为Window-1)中打开,如下所示:blah ....,
- k1 Y( p# ~- V* J5 ?/ Y- J# P7 ^: IALTER TRIGGER trgInsAfter AS .... BEGIN ... END4 k6 [- A9 _3 z$ `! W

( {7 `% E8 \' U% `打开另一个查询窗口(称为Window-2),输入sql将一行插入表t中:3 N/ S) t/ x! D1 E4 @
insert t(c1,c2) values(1,'aaa')5 X% p7 o; j% T, M* K5 e
' G0 y4 h* \! c
在Window-1中设置一个断点(在触发器的代码中)
7 a2 {' t; Y5 d
$ Z/ X. `+ M; [9 F在Window-2中设置一个断点(插入SQL代码)9 e; u: U, v( X  W! }
' C3 a) R) d4 V8 F' `! F& u( A
在Window-2是当前窗口的情况下,单击工具栏上的“调试”按钮
2 q# ~( h" [/ i/ q  ~3 N8 A2 Y/ l/ ?, K& m; \
[/ol]) q+ ?. F$ {0 G) V( G1 R
插入SQL代码的断点被命中,但是当我查看Window-1时,触发器代码中的断点有一个工具提示,说 'unable to bind SQL
, p) P( b1 V: r2 k& O! W1 ]: m8 t6 |" Cbreakpoint, object containing the breakpoint not loaded'1 K, G- H% A2 ?( x
我可以理解一个问题:如何SSMS知道Window-1中的代码是触发器
6 @2 B# {/ k% u我要调试吗?我看不到要告诉SSMS的地方,“嘿,此查询编辑器中的代码是表t的插入触发器的代码”, R- Z  \- o2 c% q
有什么建议?) j( t5 W7 n) r) m0 i) b! i9 p5 D' a7 e6 Q1 v
谢谢( Z' h6 |9 `& t0 t6 o, p
                ( z. S2 n4 ^# c  c& f" v
解决方案:6 K* G9 ~# s4 e# ]
               
5 o2 n- N# ^! P0 f
3 ]3 b3 f3 V1 x8 J( V* k0 e6 [! }
! n7 n' @% r8 C8 Q5 H: R# n" }                您实际上对此考虑过度。5 S+ i& e5 @! v7 s- c
我首先在一个窗口中运行此查询(以进行设置):
5 R) a9 L. l2 H( V( r+ _% bcreate table X(ID int not null)
! y( @0 k4 M* O) J% ccreate table Y(ID int not null)
) }& Z( }# I2 r8 C- \1 m" k2 i; xgo) _. a6 `1 i, G9 V8 g& R
create trigger T_X on X9 r$ j; Z" ~2 v% f- R
after insert- z, o* \% F' ~1 H; Z5 C
as7 D, a2 d; Y1 I0 w% S
    insert into Y(ID) select inserted.ID. T5 i0 T6 f$ r; P
go
/ A& M: E9 t2 A- E! G然后,我可以丢弃该窗口。我打开一个新的查询窗口,写:
+ V7 s& |0 N( S" I: qinsert into X(ID) values (1),(2)
9 d$ e- x3 Q  a并在该行上设置一个断点。然后,我 启动
4 @  K6 {3 E! \3 Q调试器(Debug从菜单或工具栏或Alt-F5)并等待(有一阵子,调试器从未如此之快)以使其达到该断点。然后,在那儿打了,我选择了Step7 i. `$ l4 y. @& Z  b
Into(F11)。然后(再次等待一会儿)打开了一个新窗口,这是我的触发器,调试器停止的下一行代码是insert into
* ~, M% R. `( }8 P; x. `0 ~& F  o8 UY...触发器中的行。现在,我可以在触发器中设置任何其他断点。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则