表A更新时有几个字段当满足某个条件时,将更新该表的标志位,请问用触发器实现该功能有什么问题,请大虾给个例子,感觉会形成嵌套,但是老大要求用触发器来实现。

解决方案 »

  1.   

    写触发器的时候,注意写字段触发 
    before insert or update
                  of department_id
                  on employees
    这样,就不会产生嵌套了。
    不过,注意,再次更新的内容不能是触发器所触发的字段
      

  2.   

    create or replace trigger MR_FI_APS_ORGWORKCALENDAR
    before  update of ISONDUTY on MT_PB_CL_ORGWORKCALENDAR for each row
    declare
      nISONDUTY_Old number(1);             --是否上班
      nISONDUTY_New number(1);             --是否上班
      nEXCEPTION_SIGN  number(1);--例外标志
      vPB_CL_ORGWORKCALENDARID varchar(36); --部门工作日历明细表ID
    begin
        --判断物理工厂数据是否符合触发条件
        nISONDUTY_Old:= :old.ISONDUTY;
        nISONDUTY_New:= :new.ISONDUTY;
        nEXCEPTION_SIGN:= :old.EXCEPTION_SIGN;
        vPB_CL_ORGWORKCALENDARID:= :new.PB_CL_ORGWORKCALENDARID;
        BEGIN
        dbms_output.put_line(nISONDUTY_Old);
        dbms_output.put_line(nISONDUTY_New);
        dbms_output.put_line(nEXCEPTION_SIGN);
        END;    
       if(nISONDUTY_Old <> nISONDUTY_New  ) then 
          if(nEXCEPTION_SIGN=1) then --原记录为例外
               UPDATE MT_PB_CL_ORGWORKCALENDAR  SET EXCEPTION_SIGN = 0 --更新例外标志
                 WHERE PB_CL_ORGWORKCALENDARID = vPB_CL_ORGWORKCALENDARID;
          else --原记录为正常
               UPDATE MT_PB_CL_ORGWORKCALENDAR  SET
                         EXCEPTION_SIGN = 1 --更新例外标志
                 WHERE PB_CL_ORGWORKCALENDARID = vPB_CL_ORGWORKCALENDARID;
           end if;
       end if;  
    end MR_FI_APS_ORGWORKCALENDAR;
      

  3.   

    不行啊,如果不用for each row 不能读取new和old的值
      

  4.   

    如果不用for each row 不能读取new和old的值,
    因為沒有for each row,Trigger觸發的對象是整個Table,針對整個表的更新或操作,所以不會有:old,:new
    有each row,表示觸發的對象是每一條記錄,所以對單筆記錄有:old的值和:New的值之分
    因此,應該是for each row的只會鎖定被更新列,如果沒有for each row,該表整個表會被鎖定不允許再做update類的操作,可以試試...
      

  5.   

    select 1=1,1='1', '1.0'=1, '1'='1.0', '01' = ' 1', '01' = '  1 ', 1='01 ', '1 '=1, '1.'=1, 1.00=1.0, '1.00'='1.0';What's the result in MYSQL? If using Oracle, add "from dual" at the end.DO YOU KNOW BEFORE RUNNING IT?