<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MDA/MDD/TDD/DDD/DDDDDDD
    posts - 536, comments - 111, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    觸發器

    Posted on 2007-07-14 22:35 leekiang 閱讀(331) 評論(0)  編輯  收藏 所屬分類: oracle
    create or replace trigger auth_secure
    before insert or update or delete 
    on auths //對整表更新前觸發
    begin
    if(to_char(sysdate,'DY')='SUN'
    RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
    end if;
    end 

    RAISE_APPLICATION_ERROR的錯誤代碼在-20000到-20999之間,這樣就不會與 ORACLE 的任何錯誤代碼發生沖突

    禁止ddl操作
    create or replace trigger ddl_deny
    before create or alter or drop or truncate on database//系統級別的觸發器
    declare
    v_errmsg varchar2(100):= 'You have no permission to this operation';
    begin
    if ora_sysevent = 'CREATE' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
    elsif ora_sysevent = 'ALTER' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
    elsif ora_sysevent = 'DROP' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
    elsif ora_sysevent = 'TRUNCATE' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
    end if;
    exception
    when no_data_found then
    null;
    end;
    又一例:
    create or replace trigger his_trig_u
      after update ON MYDATA
      FOR EACH ROW
    declare
      temp_count number;
    BEGIN
      select count(*)
        into temp_count
        from DATAHIS t
       where t.num = :new.num
         and t.time = :new.time;
      if temp_count = 0 then
        insert into DATAHIS
          (uid, num, value, time)
        values
          (data_sql.nextval,
           :new.num,
           :new.value,
           :new.time);
      end if;
    END;
    begin前面出現的new,old不加冒號,begin和end之間出現的new和old都要在前面加上":"

    用觸發器完成動態數據的操作
      在涉及如何實現動態庫存的問題時,可用觸發器解決。倉庫有驗收、出庫、調撥、報廢、退料、讓售等這些數據必須與以前的庫存相加減,才能完成動態庫存操作。本文僅以驗收單觸發器為例,其它的結構雷同。它們涉及到兩個基表:bi­_ysd(驗收單),Bj_kcb(當前庫存表),前者的表結構(rq(日期),ysdh(驗收單號), bjbm(備件編碼),yssl(驗收數量),ysdj(驗收單價)),后者的表結構為(bjbm(備件編碼),dqkcl(當前庫存量),dqkcje(當前庫存金額))觸發器如下:
      
     create or replace trigger trig_ysd
     after insert or update or delete on bj_ysd
     for each row
      declare rq1 varchar2(8);rq2 varchar2(8);
      /*限于篇幅,yssl1,yssl2,ysdj1,ysdj2,bjbm1,bjbm2,ii聲明略*/
      if inserting or updating then
       rq1:=:new.rq;bjbm1:=:new.bjbm;yssl1:=:new.yssl;
       ysdj1:=:new.ysdj;
      
       select count(*) into ii from bj_dqkcb
       where bjbm=bjbm1;
      
       if ii=0 then
        insert into bj_dqkcb(bjbm,dqkcl,dqkcje)
        value(bjbm1,yssl1,ysdj1);
       else
        update bj_dqkcb
        set dqkcl=dqkcl+yssl1;
           dqkcje=dqkcje+yssl1*ysdj1;
       end if
      end if
      
      if deleting or updating then
       rq2:=:old.rq;
       bjbm2:=:old.bjbm;
       yssl2:=:old.yssl;
       ysdj2:=:old.ysdj;
       update bj_dqkcb
       set dqkcb=dqkcl-yssl2;
        dqkcje=dqkcje-yssl2*ysdj2
      end if;
     end ;
    主站蜘蛛池模板: 亚洲卡一卡2卡三卡4麻豆| 黄页免费视频播放在线播放| 国产电影午夜成年免费视频| 久久久久亚洲精品无码系列| 16女性下面扒开无遮挡免费| 亚洲成人午夜电影| 国产成人精品男人免费| a级毛片毛片免费观看久潮| 亚洲无人区视频大全| 国产精品免费小视频| 久久久精品免费国产四虎| 亚洲中文无码亚洲人成影院| 亚洲国产一级在线观看 | 亚洲福利视频网站| 国产一区二区三区在线免费观看| 精品免费视在线观看| 亚洲αⅴ无码乱码在线观看性色| 亚洲大尺度无码无码专区| 女人18毛片水真多免费播放| 在线免费观看h片| 国产亚洲人成在线播放| 亚洲美女色在线欧洲美女| 亚洲av再在线观看| 国内外成人免费视频| 免费A级毛片无码视频| 一级毛片免费播放试看60分钟| 亚洲在成人网在线看| 亚洲AV无码精品无码麻豆| 免费一区二区三区四区五区| 免费看韩国黄a片在线观看| 中文字幕在线观看免费视频 | 91亚洲精品麻豆| 亚洲高清不卡视频| 亚洲人成在线影院| 国产亚洲一区二区精品| 亚洲日韩中文无码久久| 国产精品亚洲mnbav网站| 亚洲国产91精品无码专区| 国产男女猛烈无遮挡免费视频| 97在线观看永久免费视频| 18禁无遮挡无码国产免费网站|