트리거 학습 노트 (: 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 블록을 간단하게 뛰어넘을 뿐이다.
####트리거는 문장급 트리거와 행급 트리거로 나뉜다
: NEW와: OLD 사용 방법과 의미, new는 insert와 업데이트에만 나타나고, old는 업데이트와 delete에만 나타납니다.
insert시 new는 새로 삽입된 줄 데이터를 표시하고, 업데이트시 new는 바꿀 새 데이터를 표시하며,old는 변경할 원래의 줄 데이터를 표시하고, delete시old는 삭제될 데이터를 표시합니다.
### 예(1)
 create table t_emp2_log( 
          t_id  number(10) primary key,  --   
          t_date  date,     --     
          t_user  varchar2(20),  --     
          action varchar(20)   --        
   );  
   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