又有个问题来请教大家:我对别人已经开发好的系统S中的一个SQL表a做了一个触发器tr_a,里面仅有两条最简单的SELECT语句,如下:
go
CREATE TRIGGER tr_a ON a FOR UPDATE
AS
select 1;
select 1 / 0;
go
两条语句中,第二条会产生一个除数为0的错误。
创建成功后,我在查询分析器中用Update语句对表a进行更新,结果会如预期报错;
但如果在系统S的程序前台界面上执行更新操作,则程序不会报错(但更新不成功);
如果将select 1;与select 1 / 0;对调(如下),则前台执行时会如预期报除数为0的错。
go
CREATE TRIGGER tr_a ON a FOR UPDATE
AS
select 1 / 0;
select 1;go经检测,触发器只要执行了select 语句,就会出现这个异常:没有异常信息、前台程序认为已成功更新,但实际上更新不成功。我特意用了跟踪,将系统S对数据库表a的更新前后的相关语句全部跟踪了出来,放到查询分析器中执行,触发器也可以正常被调用。由于系统S是别人开发的,我没有源代码,我想问的问题是:系统S的程序究竟对表a的触发器做了什么动作,使得触发器会产生这样的异常?
我的触发器(比上面的例子复杂N百倍)又非做不可,请问我应该怎么办?
go
CREATE TRIGGER tr_a ON a FOR UPDATE
AS
select 1;
select 1 / 0;
go
两条语句中,第二条会产生一个除数为0的错误。
创建成功后,我在查询分析器中用Update语句对表a进行更新,结果会如预期报错;
但如果在系统S的程序前台界面上执行更新操作,则程序不会报错(但更新不成功);
如果将select 1;与select 1 / 0;对调(如下),则前台执行时会如预期报除数为0的错。
go
CREATE TRIGGER tr_a ON a FOR UPDATE
AS
select 1 / 0;
select 1;go经检测,触发器只要执行了select 语句,就会出现这个异常:没有异常信息、前台程序认为已成功更新,但实际上更新不成功。我特意用了跟踪,将系统S对数据库表a的更新前后的相关语句全部跟踪了出来,放到查询分析器中执行,触发器也可以正常被调用。由于系统S是别人开发的,我没有源代码,我想问的问题是:系统S的程序究竟对表a的触发器做了什么动作,使得触发器会产生这样的异常?
我的触发器(比上面的例子复杂N百倍)又非做不可,请问我应该怎么办?
select 1;
select 1 / 0; 可以看成没有触发器的情况下执行下面这段语句,当然是不成功的update a
set 。 select 1;
select 1 / 0;
or
update a
set 。
select 1 / 0;
select 1;
应该是你的前台问题,
在mssql还境里不管在前,或在后都是(除0错误)
select 1 / 0;
第二句是我故意弄出来看错误提示的,如果会出现提示表示SQL会执行到这一条。
我换成下面的语句
select a=1 into tablea
执行后去查,也查不到表tablea,这说明select a=1 into tablea这条不会被执行。我要说的这个奇怪的问题是:触发器中,只要执行了一条select 语句,后面的任何语句都不会被执行,更新操作也没有成功,但SQL返回给前台程序的信息是(更新操作及其触发器)执行成功。下面是我跟踪出来的语句,我将这些语句直接放在查询分析器上执行,没有这个问题,即触发器的内容全部会被执行!
--(Rdrecord就是我上面触发器的a表)SET NO_BROWSETABLE OFF
go
set implicit_transactions on
go
Update Rdrecord WITH (UPDLOCK) Set cHandler=N'demo', dVeriDate=N'2009-02-26'
go
IF @@TRANCOUNT > 0 COMMIT TRAN
go
set implicit_transactions off
SET NO_BROWSETABLE ON
select 1 into tablea;
select 1 / 0;
AS
set nocount on;
select 1;
select 1 / 0;
go 看别人已经开发好的系统S是否报错?ps:那程序delphi开发的吧
问题是我将存储过程写成下面的两条正确的语句,它也不会执行第二条!
select a1=1 into tablea1 ;
select a=1 into tablea2;执行后,找不到表tablea2说明第二条没被执行.程序是 用友U871,更新操作其实是《采购入库单》的“审核”操作.
用友U871估计是用VB6.0开发的.
set nocount on;
试试用友和金蝶经常有些怪问题
ADO版本太多,有些版本存在一些严重缺陷。
另外,早期一些开发厂商会部分改动ADO控件,这些都可能是原因。
试试