PLSQL構文7-トリガベース

3882 ワード

トリガのタイプ:

  • DMLフリップフロップ:テーブルまたはビューに対してDML操作を行う時にトリガーする;
  • INSTAD OFフリップフロップ:実際の操作文を置き換えるためにビューにのみ定義されます.
  • システムトリガ:DDL文、データベースの起動または停止などのシステムイベントなどのデータベースシステムを操作したときにトリガーされます.

  • トリガーイベント:


    トリガがトリガーされるイベント(INSERT、UPDATE、DELETE文によるテーブルまたはビューのデータ処理操作など)、DDL文(CREATE、ALTER、DROP文によるデータベースの作成、変更、削除など)、データベース・システム・イベント(システムの起動または終了、例外エラーなど)、ユーザー・イベント(データベースへのログインまたは終了など).

    トリガ条件:


    トリガ条件は、WHERE句によって指定される論理式です.トリガは、式の値がtrueの場合にのみ、トリガイベントに遭遇して自動的に実行され、トリガ操作が行われます.そうしないと、トリガイベントに遭遇してもトリガは実行されません.

    トリガーオブジェクト:


    フリップフロップが実行するPL/SQLプログラム、すなわち実行部.

    トリガタイミング:


    トリガタイミングトリガのトリガ時間を指定します.BEFOREとして指定されている場合は、DML操作を実行する前に、いくつかのエラー操作が発生したり、いくつかのビジネス・ルールが実装されたりすることを防止するためにトリガーされることを示します.AFTERとして指定されている場合は、DML操作の後にトリガされ、その操作または何らかの事後処理が記録されることを示す.

    条件述語:


    トリガに複数のトリガ・イベント(INSERT、UPDATE、DELETE)の組合せが含まれている場合、それぞれ異なるイベントに対して異なる処理を行うために、Oracleで提供される次の条件述語を使用する必要があります.
    INSERTING:トリガイベントがINSERTの場合はTRUE、そうでない場合はFALSEとする.
    UPDATING[(column_1,column_2…column_n)]:トリガイベントがUPDATEの場合、column_を変更した場合x列の場合はtrue、そうでない場合はfalse、column_xはオプションです.
    DELETING:トリガイベントがDELETEの場合はTRUE、そうでない場合はFALSEとなります.

    トリガサブタイプ:


    トリガサブタイプは行トリガ(row)と文トリガ(statement)に分けられ、行トリガは各行の操作に対してトリガされ、文トリガはこの操作に対して1回のみ実行され、一般的にsql文操作を実行する場合は行トリガであり、テーブル全体に対してセキュリティチェック(すなわち不正操作の防止)を行う場合にのみ文トリガされます.これを省略すると、デフォルトでは行がトリガーされます.
    また、トリガには、トリガされたローの古い値と新しい値に対応する2つの相関値があり、oldとnewで表されます.

    トリガーの作成:

    /*CREATE [OR REPLACE] TRIGGER <    >
           
          */

    例1:
    --   
    --  1:        ,                 
    create or replace trigger t_back_grade
      after delete
      on grade 
      referencing new as new old as old --              
      for each row
    declare
      r_grade grade%rowtype;
    begin
      --       
      r_grade.id := :old.id;
      r_grade.name :=:old.name;
      
      --        ...
      
      --      commit;
    end t_back_grade;
    
    
    
    
    
    
            :
    
    CREATE OR REPLACE TRIGGER "BIZBENIFITRATELOG_TR"
      BEFORE INSERT OR UPDATE OR DELETE ON BIZBENIFITRATELOG
      referencing new as new old as old
      FOR EACH ROW
    declare
      i        number(10);
      ii       number(10);
      opttype  CHAR(1);
      dataid   varchar2(32);
      parentid varchar2(32);
      icount   number(10);
      iflag    number(1);
      state    varchar2(2);
    
    begin
      iflag  := 0;
      icount := 0;
      if inserting then
        if :new.id is null then
          select BIZBENIFITRATELOG_S.nextval into :new.id from dual;
        else
          select BIZBENIFITRATELOG_S.nextval into ii from dual;
          select BIZBENIFITRATELOG_S.currval into ii from dual;
          while (:new.id > ii) loop
            select BIZBENIFITRATELOG_S.nextval into ii from dual;
          end loop;
        end if;
      end if;
      parentid := :new.ALLOTID;
      if inserting then
        opttype := 'A';
        dataid  := :new.ID;
      elsif updating then
        select count(1)
          into icount
          from msgsend
         where BIZTABLE = 'Bizbenifitratelog'
           and BIZID = :new.ID
           and BIZSTATE in ('0', '3');
        if icount > 0 then
          iflag := 1;
        else
          opttype  := 'M';
          dataid   := :new.ID;
          parentid := :old.ALLOTID;
        end if;
      else
        opttype  := 'D';
        dataid   := :old.ID;
        parentid := :old.ALLOTID;
      end if;
      if iflag = 0 then
        select msgsend_s.nextval into i from dual;
        if opttype = 'D' then
          state := '5';
        else
          state := '0';
        end if;
        insert into msgsend
          (ID,
           BIZTYPE,
           BIZID,
           PARENTID,
           BIZTABLE,
           OPERATETYPE,
           BIZSTATE,
           BIZDATE,
           NUM)
        values
          (i,
           'Bizallot',
           dataid,
           parentid,
           'Bizbenifitratelog',
           opttype,
           state,
           to_char(sysdate, 'YYYY-MM-DD'),
           0);
      end if;
    end BIZBENIFITRATELOG_TR;