又有个问题来请教大家:我对别人已经开发好的系统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百倍)又非做不可,请问我应该怎么办?

解决方案 »

  1.   

    其实就是当表A发生更新的时候接着执行下面这段语句。
      select 1; 
    select 1 / 0; 可以看成没有触发器的情况下执行下面这段语句,当然是不成功的update a
    set 。  select 1; 
    select 1 / 0; 
    or
    update a
    set 。
    select 1 / 0;
      select 1; 
     
      

  2.   

    这个还真没注意过,呵呵,那参考石头大哥的,在执行完语句后判断一下@@ERROR
      

  3.   


    应该是你的前台问题,
    在mssql还境里不管在前,或在后都是(除0错误)
      

  4.   

    select 1; 
    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
      

  5.   

    另外,我做了一个存储过程,单独执行没有问题,但如果让这个触发器调用,也有这个问题,即只要执行一条Select 语句,它后面的语句就不会被执行!但也有个例外,即如果select 是用来给变量赋值,则这条语句执行后,会执行后面的语句,直到执行其它select语句又一样会跳出,比存储过程的内容如下面所示,则SQL会执行到第二条语句!select @a=1
    select 1 into tablea; 
    select 1 / 0; 
      

  6.   

    这是别人已经开发好的系统S对错误的处理机制引起的,并非后面的语句不执行,而是对后面语句的错误信息不处理你这样试试CREATE TRIGGER  tr_a ON a FOR UPDATE                          
    AS                                  
      set nocount on;
      select 1; 
    select 1 / 0; 
    go 看别人已经开发好的系统S是否报错?ps:那程序delphi开发的吧
      

  7.   

    TO: 8 楼 haiwer :
    问题是我将存储过程写成下面的两条正确的语句,它也不会执行第二条!
    select a1=1 into tablea1 ; 
    select a=1 into tablea2;执行后,找不到表tablea2说明第二条没被执行.程序是 用友U871,更新操作其实是《采购入库单》的“审核”操作.
    用友U871估计是用VB6.0开发的.
      

  8.   

    一样加
    set nocount on;
    试试用友和金蝶经常有些怪问题
      

  9.   

    delphi或者VB6等开发工具,一般使用ADO,
    ADO版本太多,有些版本存在一些严重缺陷。
    另外,早期一些开发厂商会部分改动ADO控件,这些都可能是原因。
      

  10.   

    这个倒是还真没有试过,SQL 2005不知道Trigger中可以用BEGIN TRY END TRY BENGIN CATCH END CATCH
    试试