我写了这样的一个触发器:
  CREATE OR REPLACE TRIGGER temp_aiur
  AFTER UPDATE ON tbl_a
  FOR EACH ROW
  BEGIN
    update tbl_b tb set (empno, sal, age)= (select ta.empno, 
                                                   ta.sal, 
                                                    ta.age 
                                            from tbl_a ta 
                                            where tb.empno=ta.empno 
                                              and tb.xh=ta.xh;
  end;原来没有添加 tb.empno=ta.empno这个条件时,运行得一直比较顺利,但是好像自从添加了这个条件以后经常不能update到表tbl_b, 我试着手工执行是没有问题得,但是为什么老是触发不成功呢???

解决方案 »

  1.   

    好像有点问题,如果a更新了empno列的话你的这个触发器怎么办?
      

  2.   


    --只对empno,sal,age这3列更新,才会被触发的触发器
     CREATE OR REPLACE TRIGGER temp_aiur 
      AFTER UPDATE  of (empno,sal,age) ON tbl_a 
      FOR EACH ROW 
    BEGIN 
    UPDATE tb1_b tb 
    set tb.empno=:new.empno,tb.sal=:new.sal,tb.age=:new.age
    where tb.empno=:old.empno and tb.xh=:old.xh 
    end; 
      

  3.   

    同感,你要更新empno,又以这个字段作为更新的条件,感觉怪怪的,不知道上面的方法行不行
      

  4.   


    你这样写,把触发器中经典的new和old都舍弃了。
      

  5.   

    问题出在更新 tbl_a表 的列empno,是后触发,导致where条件不成立。
    可以修改成如下:
    //后触发
     CREATE OR REPLACE TRIGGER temp_aiur 
      AFTER UPDATE  of (empno,sal,age) ON tbl_a 
      FOR EACH ROW 
    BEGIN 
    UPDATE tb1_b tb 
    set tb.empno=:new.empno,tb.sal=:new.sal,tb.age=:new.age
    where tb.empno=:new.empno and tb.xh=:old.xh 
    end; 或
    //前触发
      CREATE OR REPLACE TRIGGER temp_aiur
      BEFORE UPDATE ON tbl_a
      FOR EACH ROW
      BEGIN
        update tbl_b tb set (empno, sal, age)= (select ta.empno,
                                                      ta.sal,
                                                        ta.age
                                                from tbl_a ta
                                                where tb.empno=ta.empno
                                                  and tb.xh=ta.xh)
      end; 
      

  6.   

    回去测试 在oracle里面正对列级别的触发器 只有DML触发器update才有效
    格式如下: CREATE OR REPLACE TRIGGER temp_aiur 
      AFTER UPDATE  of empno,sal,age ON tbl_a 
      FOR EACH ROW 
    BEGIN 
    UPDATE tb1_b tb 
    set tb.empno=:new.empno,tb.sal=:new.sal,tb.age=:new.age
    where tb.empno=:old.empno and tb.xh=:old.xh 
    end;