트리거 학습 노트 (: 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