Published 2020. 5. 29. 20:00
728x90
반응형

Trigger

특정이벤트, DDL, DML문이 실행되었을때,자동적으로 어떤 처리가 일어나도록 하는 데이터 베이스 객체

1. DML Trigger  --어떤테이블 추가/생성 되었을때 실행 
2. DDL Trigger
3. Logon /Logoff Trigger

 

예제)

급여내역이 변경될때 내역이 기록되도록 처리

create or replace trigger trig_salary_log
    after --주 DML문 실행 전before / 실행후after 이 트리거를 작동
    update on emp_test1 --특정테이블의 insert, update, delete문 실행시 trigger가 작동하도록 함       
    for each row
    --문장 레벨 트리거 : (기본값) dml문당 한번 trigger가 실행
    --행 레벨 트리거 : (for each row) dml문에서 적용되는 행마다 trigger 실행
    
begin
    dbms_output.put_line('변경전 : ' || :old.salary);
    dbms_output.put_line('변경후 : ' || :new.salary);
    
    --로그테이블 기록
    insert into emp_test1_salay_log
    values(seq_emp_salary_log.nextval, :old.emp_id, :old.salary, :new.salary, default);
    
    --trigger안에서는 TCL문 실행할 수 없음
    --트리거 안의 dml문은 주 dml문과 트랜잭션을 함께 함
end;
/

--dml문 실행시 트리거 자동 실행

 

예제

create table emp_log 
as
select 123 log_no,  --number타입으로 생성됨
sysdate log_date,
emp_test1.*
from emp_test1
where 1=0;  --테이블의 구조만 복사(어떤행도 나오지 않음)
select * from emp_log;
--테이블 제약조건 추가 및 변경
alter table emp_log 
add constraint pk_emp_log_no primary key(log_no)
modify log_date default sysdate not null;

create sequence seq_emp_log;

create or replace trigger trig_emp_log
    after
    insert or update on emp_test1
    for each row
begin
   insert into emp_log
    values(:new.emp_id, :new.emp_name, :new.emp_no, :new.email, :new.phone, :new.dept_code, :new.job_code, :new.sal_level
    , :new.salary, :new.bonus, :new.manager_id, :new.hire_date, :new.quit_date, :new.quit_yn, seq_emp_log.nextval, default);
end;
/
반응형

'프로그래밍 > SQL' 카테고리의 다른 글

09.17(정규화 예제)  (0) 2020.09.17
09.16(정규화)  (0) 2020.09.16
05.28(PL/SQL)  (0) 2020.05.28
05.27(VIEW, SEQUENCE)  (0) 2020.05.27
05.26(DCL과 TCL 명령어, DD)  (0) 2020.05.26
복사했습니다!