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;
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이(가) 컴파일되었습니다.
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 불가
반응형