다연이네

[days16] Trigger (트리거) 본문

Oracle

[days16] Trigger (트리거)

 다연  2020. 11. 20. 00:38
반응형

trigger란 어떤 작업전, 또는 작업 후 trigger에 정의한 로직을 실행시키는 PL/SQL 블럭이다.


 상품구매 -> 회원테이블의 누적 포인트 증가 
 A 10          50 -> 60

 

【형식】 
CREATE [OR REPLACE] TRIGGER 트리거명 [BEFORE ? AFTER]
  trigger_event ON 테이블명
  [FOR EACH ROW [WHEN TRIGGER 조건]] --행 트리거임을 알림 :행마다 반복해서 트리거 실행 (김씨 모두 삭제 : 5명이라면 5번 수행)
DECLARE                             --1번만 트리거가 발생하면 문장 트리거
  선언문
BEGIN
  PL/SQL 코드
END;

 

 

 

create table tbl_trigger01(
 id number primary key
 ,name varchar2(20)
);

create table tbl_trigger02(
 memo varchar2(100)
 ,ilja date default sysdate
);

tbl_trigger01 테이블에 레코드 insert -> 자동으로 tbl_trigger02에 로그 기록
(일자, 트리거1 테이블에 데이터 추가)

 

insert into tbl_trigger01 values (1, '홍길동');
insert into tbl_trigeer02 values('홍길동 추가됨', '2020.11.19');

->이 로그 기록 작업을 트리거를 이용해 자동으로 하겠다

 

after trigger

--추가 후 로그 기록 == after
create or replace trigger tri_tbl_trigger01_insert --tri_대상테이블_DML
after --실제 01테이블에 insert작업이 완료된 후 자동으로 처리되는 트리거
insert on tbl_trigger01 -- 어떤작업 on 트리거명
--FOR EACH ROW [WHEN TRIGGER 조건] 행트리거가 아니라 1번만 실행되는 문장 트리거니까 제외
declare
  vmemo varchar2(100);
begin
  vmemo := '>추가 작업 - 로그 기록';
  insert into tbl_trigger02 (memo) values(vmemo);
  --저장프로시저는 commit/rollback 해야하지만 트리거 안에서는 자동으로 커밋/롤백 된 (auto commit)
--exception
end;
--Trigger TRI_TBL_TRIGGER01_INSERT이(가) 컴파일되었습니다.



insert into tbl_trigger01 values (1, '홍길동');

select * from tbl_trigger01;
select * from tbl_trigger02;
commit;

tbl_trigger01
tbl_trigger02

insert + update + delete 추가하기

create or replace trigger tri_tbl_trigger01 
after 
insert or update or delete on tbl_trigger01  --or로 나열 가능
declare
  vmemo varchar2(100);
begin
  if inserting then 
    vmemo := '>추가 작업 - 로그 기록';
  elsif updating then 
    vmemo := '>수정 작업 - 로그 기록';
  elsif deleting then 
    vmemo := '>삭제 작업 - 로그 기록';
  end if;
  insert into tbl_trigger02 (memo) values(vmemo);
end;
--Trigger TRI_TBL_TRIGGER01이(가) 컴파일되었습니다.

insert, update, delete마다 다른 메시지 출력

before trigger

--주말/근무시간 외에는 주문X  주문~insert
create or replace trigger tri_before_test
before --실제 insert 전에 트리거 수행 
insert or update or delete on tbl_trigger01 --이벤트를 받을 대상 테이블
declare 
  vmemo varchar2(100);
begin
  if to_char( sysdate, 'DY') in ('토','일') 
  or to_char(sysdate, 'HH24')<9 
  or to_char(sysdate, 'HH24')>18 then --근무시간 외라면 강제 예외 발생 -> 당연히 그 다음 insert작업도 불가
    vmemo:= '근무시간 외 또는 주말에는 DML 처리 못함 - 로그 기록'; --롤백되어져서 이 메시지도 같이 롤백
    insert into tbl_trigger02 (memo) values(vmemo);
    raise_application_error(-20000, '근무시간 외에는 DML 불가');
 -- elsif then
  end if;
end;
--Trigger TRI_BEFORE_TEST이(가) 컴파일되었습니다.


insert into tbl_trigger01 values (2, '김동준');
--ORA-20000: 근무시간 외에는 DML 불가

반응형
Comments