a. 把错误信息返回前台,可以用raiserror(),由客户端处理错误。
b. 如果有嵌套的事务,在commit/rollback tran前,应该先判断当前事务嵌套的层数@@TRANCOUNT。

解决方案 »

  1.   

    在SQL SERVER端的程序处理时可参考楼上的,加上判断。
    对于前端程序调用,似乎不太好处理,我用DELPHI,是获取出错信息来处理的。
      

  2.   

    1.触发器实际上也是一组PL/SQL语句,与存储过程不同的是它是通过事件触发执行,在触发器执行时实际上也是一组DDL(例如SELECT)和DML(例如INSERT,DELETE,UPDATE)语句对事务的一致的保证和你单独执行这些语句是一样的。他将触发器要修改的数据块在回滚段和内存中做镜象,然后将要修改的数据行锁定如果此时有其他查询访问其锁定的数据将查看内存中的镜象数据如果内存中的镜象数据被覆盖掉了将查看回滚段的镜象信息。如果你要访问的数据正被另一个事务占用,那么你的事务将等待此事务结束后才能进行。
    2.事务是以COMMIT和ROLLBACK结束的在一个事物结束之前同一个会话是不能再起另一个事务的。
      

  3.   

    一般数据库中,一个触发器往往是作为一个原子语句,也就是一个事务来对待,直接用raiserror命令捕获错误信息,用rollback直接回滚,无须在其中再定义事务;
      

  4.   

    CREATE TRIGGER tD_shzb ON dbo.shzb 
    FOR DELETE 
    AS
    begin
      if exists(
    select deleted.*
    from deleted,shmxb
    where shmxb.shdh=deleted.shdh
    )
    begin
    rollback transaction
    raiserror("The value of field_SHDH in the table_SHZB 
    does exist in the table_SHMXB",11,1)
    return
    end
      if exists(
    select * 
    from deleted,gyftb
    where deleted.shdh = gyftb.shdh
    )
       begin
     rollback transaction
     raiserror("存在相应的收货付退记录,不允许删除!",11,1)
     return
       end  if exists(
    select * 
    from deleted,fkqkmxb
    where deleted.shdh = fkqkmxb.shdh
    )
       begin
     rollback transaction
     raiserror("存在相应的付款记录,不允许删除!",11,1)
     return
       end
      return
    end
    GO