try:create or replace trigger da_delete
  before delete on da  
  for each row
begin
 update da set xh=xh-1 where id=:old.id and xh>:old.xh;
end da_delete;

解决方案 »

  1.   

    都delete了怎么update,当然是再delete前update了
    create or replace trigger da_delete
      before delete on da  
      for each row
    begin
     update da set xh=xh-1 where id=:old.id and xh>:old.xh;
    end da_delete;
      

  2.   

    改成before 也不行,同样的错误。
    错误信息:
    ORA-04091:表da 发生了变化,触发器/函数不能读
    ORA-06512:在"da_delete",line 2
    ORA-04088:触发器'da_dalete'执行过程中出错
      

  3.   

    这样怎么样?
    create or replace trigger da_delete
      before delete on da  
      for each row
    begin
     update da set xh=xh-1 where xh>:old.xh;
    end da_delete;
      

  4.   

    即使是把语句改成 update da set xh=xh
    还是出错,错误信息一样。
      

  5.   

    语句改成 update da set xh=xh肯定不用看都知道会出错。
    xh是不是主键?
    create or replace trigger da_delete
      after delete on da  
      for each row
    begin
     update da set xh=xh-1 where xh>:old.xh;
    end da_delete;
      

  6.   

    触发器不能再对自己进行操作,因为此时表是一个变异的表,只能通过其他的途径来处理!
    就是在触发器中进行select也不行!这是一个比较烦的问题!
      

  7.   

    你可以在程序调用完成后进行这样一个操作,即可以写一个删除该表记录的存储过程,删除该表的记录时调用这个过程进行删除,不要直接进行删除就可以了!还可以在触发时先写到一个临时表中,然后设置一个job进行循环处理,都不是非常的方便!