现在需求如下:
有一个员工表,给员工加工资的时候需要给经理也加工资,而经理也算员工,所以和一般员工是在一张表里
这样的话触发器里就肯定要涉及到员工表的修改,然而该触发器就是由对员工表的修改触发的,所以会造成递归问题报错
ORA-04091: table SCOTT.LOBATT_EMP is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.LOBATT_EMP_AUR", line 8
ORA-04088: error during execution of trigger 'SCOTT.LOBATT_EMP_AUR'请问又没有什么办法可以让我在触发器里修改触发该触发器的表?

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER GA.TEST
    AFTER INSERT
    ON GA.GAT_BASE_LIST 
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    DECLARE
    BEGIN
     ...
    END;
    這是行級觸發器,
    而且一般的是
    CREATE OR REPLACE TRIGGER GA.TEST
    AFTER INSERT
    ON GA.GAT_BASE_LIST 
    REFERENCING NEW AS NEW OLD AS OLD
    DECLARE
    BEGIN
     ...
    END;
      

  2.   

    还是用sequence好
    create sequence sequencename
    start with 1
    increment by 1
    由1开始每次增加1在修改表的时候用sequencename.nextval
    exqmple:
    create table(a number(10))
    insert into table values(sequencename.nextval);
    每次使用调用一次,sql不掉用不增加
      

  3.   

    CREATE OR REPLACE TRIGGER "SCOTT"."EMP_AUR" 
    AFTER
    UPDATE OF "SALARY" ON "EMP" 
    FOR EACH ROW 
    DECLARE 
    rise NUMBER := :new.salary - :old.salary;
    dept VARCHAR(20) := :old.dept_name;
    m_name VARCHAR(20);
    BEGIN
    IF(rise > 0) THEN
      select manager into m_name from dept where dept_name = dept;
      IF(:old.ename != m_name) THEN
      update emp set salary = salary + rise*0.1 where ename = m_name;
      update dept set budget = budget + rise*1.1 where dept_name = dept;
      ELSE 
      update dept set budget = budget + rise where dept_name = dept;
      END IF; 
    END IF;
    END;
    以上是我的触发器,作用是当给一个员工加工资的时候
    自动给他的经理加他工资的10%,然后把部门预算也加上相应的值但是我的触发器在执行dept表的更新的时候没问题,执行emp表的更新的时候却报错 
    因为就是对emp标的更新触发了该触发器所以我怀疑如果在触发器里执行将会触发该触发器的语句是有问题的
    要么oracle不支持
    要么就需要特别的途径...
    现在就是想不出来要用什么途径...