트리거 학습 노트 (: new,:old 사용법)

####트리거는 데이터베이스에서 어떤 조작이 발생할 때 자동으로 실행되는 프로그램이다
데이터의 완전성을 유지하거나 데이터베이스 조작 정보를 기록하는 데 사용되는 트리거는 직접 호출할 수 없고 일부 사건이 발생할 때만 촉발할 수 있다. 즉, 시스템이 자동으로 호출할 수 있다.
CREATE [ OR REPLACE] TRIGGER trigger_name

BEFORE | AFTER

event1 [OR event2 OR event3 …]

ON TABLE_NAME [FOR EACH ROW]

BEGIN

STATEMENT;

…

END; 


이벤트는 보통 insert, delete, 업데이트 등 DML 작업입니다
##### 설명:
For each row의 의미는 한 번의 조작표의 문장에서 한 줄이 성공할 때마다 한 번 터치한다는 것이다.쓰지 않으면 표급 트리거를 표시하고 몇 줄을 조작하든 한 번만 트리거한다.
When 조건의 출현은 DML을 조작할 때 반드시 트리거를 촉발할 수 있지만 트리거는 반드시 실제 작업을 하지 않는다는 것을 설명한다. 예를 들어 when 후의 조건이 진실하지 않을 때 트리거는 PL/SQL 블록을 간단하게 뛰어넘을 뿐이다.
####트리거는 문장급 트리거와 행급 트리거로 나뉜다
  • 문장급 트리거는 DML 문장을 실행할 때마다 한 번씩 실행하는 것을 말한다
  • 행 트리거는 각 DML 작업이 몇 개의 기록에 영향을 미치면 몇 번 트리거(for each row)
  • 행급 트리거에는 각 기록의 데이터 변동이 관련되어 있기 때문에 각 기록의 데이터에 대해 새로운 값과 낡은 값의 구분이 있다
  • #### 키워드:
    : NEW와: OLD 사용 방법과 의미, new는 insert와 업데이트에만 나타나고, old는 업데이트와 delete에만 나타납니다.
    insert시 new는 새로 삽입된 줄 데이터를 표시하고, 업데이트시 new는 바꿀 새 데이터를 표시하며,old는 변경할 원래의 줄 데이터를 표시하고, delete시old는 삭제될 데이터를 표시합니다.
    ### 예(1)
  • 조작 데이터베이스 정보를 기록하는 방면
  • t 생성emp2_log표는 emp2표에 대한 사용자의 조작 정보를 저장하는 데 사용됩니다
  •  create table t_emp2_log( 
    
              t_id  number(10) primary key,  --   
    
              t_date  date,     --     
    
              t_user  varchar2(20),  --     
    
              action varchar(20)   --        
    
       );  
    
  • 트리거 생성 temp2, 사용자가 표emp2에 대한 조작을 할 때 이 트리거를 터치하여 표emp2에 대한 사용자의 조작을 기록한다
  •  create or replace trigger t_emp2 
    
              after update or delete or insert on emp2 
    
       begin 
    
              if updating then --           
    
                 insert into  t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user,    'update'); 
    
              elsif deleting then --           
    
                 insert into t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user,    'delete'); 
    
              elsif inserting then --          
    
                 insert into t_emp2_log values(seq_t_emp2_log.nextval, sysdate, user,           'inserting'); 
    
              end if;  
    
       end; 
    

    ### 예제(2)
  • 데이터 무결성 유지...
  • create table dept2 as select * from dept; 
    
  • 의존표가 존재할 때 메인 표의 정보가 변할 때 의존표의 상응하는 정보도 변한다
  • create or replace trigger tr_emp2 
    --   dept2     , 
    after update on dept2 for each row 
    begin   
    --            ,          
    update emp2 e set e.deptno = :NEW.deptno where  e.deptno = :OLD.deptno; 
    end; 
    

    ### 예(3)
    #### 두 테이블 필드는 동일
    예: emp 테이블 empcopy 표
    #### 요구 사항: 트리거 쓰기
    팁::NEW: OLD
    #### 기능 구현
    emp표에 필드를 추가하고 deptno=10일 때 empcopy 테이블 이 데이터
    emp표에서 데이터를 업데이트하고 deptno=10을 수정할 때 empcopy 테이블 이 데이터
    -- emp_copy copy    
    
    --emp_copy          
    
    CREATE OR REPLACE TRIGGER tr_emp_copy
    
    AFTER INSERT OR UPDATE ON emp2 FOR EACH ROW
    
    
    BEGIN
    
    
    IF inserting THEN
    
    IF :NEW.deptno = 10 OR :OLD.deptno = 10 THEN
    
    INSERT INTO emp_copy VALUES (:NEW.empno, :NEW.ename, :NEW.job,
    
    
                                 :NEW.mgr, :NEW.hiredate, :NEW.sal, :NEW.comm, :NEW.deptno);
    
    END IF;
    
    ELSIF updating THEN
    
    IF :OLD.deptno = 10 THEN
    
    INSERT INTO emp_copy VALUES (:NEW.empno, :NEW.ename, :NEW.job,
    
    
                                 :NEW.mgr, :NEW.hiredate, :NEW.sal, :NEW.comm, :NEW.deptno);
    
    END IF;
    
    END IF;
    
    END; 
    
    
       
     
    
    --     
    
       /* 
    
            after ,   before   update , insert , delete  ,                  
    
         before  after   :before:insert update    new    。 
    
                           after :   new      
    
                                old      
    
     
    
       */ 
    
     
    
       create or replace trigger tri_emp2 
    
              before update on dept2 for each row 
    
       begin 
    
              :NEW.deptno := 80; 
    
              update emp2 e set e.deptno = :NEW.deptno where e.deptno = :OLD.deptno; 
    
    end; 
    
    

    전재:https://www.2cto.com/database/201301/186334.html

    좋은 웹페이지 즐겨찾기