데이터베이스

DATABASE STEP 34 - TRIGGER

2023. 3. 29. 20:04
728x90

★ 트리거(Trigger)

  • 프로시저의 한 종류
  • 개발자가 호출하는게 아니라, 미리 지정한 특정 사건이 발생하면 자동으로 실행되는 프로시저
  • 예약(사건) > 사건 발생 > 프로시저 호출
  • 특정 테이블 지정 > 감시(insert or update or delete) > 미리 준비해 놓은 프로시저 호출
  • 트리거 사용 양식
create or replace trigger 트리거명
        before|after
        insert|update|delete on 테이블명
        [for each row]
    declare
        선언부;
    begitn
        구현부;
    exception
        예외처리부;
end;

 

■ 사용 ex)

  • ex 1) tblInsa > 직원 삭제
create or replace trigger trgInsa
    before --삭제하기직전에 프로시저를 실행해라
    update -- 삭제가 발생하는지 감시해라
    on tblInsa -- 감시 대상 > tblInsa
begin   
    dbms_output.put_line('트리거가 실행되었습니다');
end trgInsa;
/

select * from tblInsa;
  • ex2) tblInsa > 직원 퇴사(단, 수요일에는 퇴사가 불가능)
create or replace trigger trgRemoveInsa
    before
    delete
    on tblInsa
begin

    dbms_output.put_line('트리거 실행');
    
    -- 수요일 퇴사 금지 > 현재 무슨 요일?
   -- if to_char(sysdate, 'day') = '수요일' then
    --if to_char(sysdate, 'dy') = '수' then
    if to_char(sysdate, 'd') = '4' then
        dbms_output.put_line('수요일');
        -- 퇴사 금지 > 지금 트리거 호출의 원인 > 실행 중인 delete문을 없었던 일로 > 취소 > 강제 예외 발생!!
        -- 자바 > throw new Exception();
        -- -20000 ~ -29999
        raise_application_error (-20000, '수요일에는 퇴사가 불가능 합니다.');
    else
        dbms_output.put_line('다른 요일');
    end if;

end trgRemoveInsa;
/
select * from tblInsa;
rollback;
delete from tblInsa where num = 1004;
  • ex3) 로그 기록을 남기는 테이블
create table tblLogMen (
    seq number primary key,
    message varchar2(1000) not null,
    regdate date default sysdate not null
);

create sequence seqLogMen;

create or replace trigger trgLogMen
    after 
    insert or update or delete
    on tblMen
declare
    vmessage varchar2(1000);
begin
    
    -- 호출 : insert? update? delete?
    dbms_output.put_line('트리거 실행');
    
    if inserting then
         dbms_output.put_line('새로운 항목이 추가되었습니다.');
         vmessage := '새로운 항목이 추가되었습니다.';
    elsif updating then
        dbms_output.put_line('항목이 수정되었습니다.');
        vmessage := '항목이 수정되었습니다.';
    elsif deleting then
        dbms_output.put_line('항목이 삭제되었습니다.');
        vmessage := '항목이 삭제되었습니다.';
    end if;
    
    insert into tblLogMen values (seqLogMen.nextVal, vmessage, default);
    
end trgLogMen;
/
select * from tblMen;

insert into tblMen values ('테스트', 22, 175, 60, null);
update tblMen set weight = 65 where name = '테스트';
delete from tblMen where name = '테스트';

■ for each row

  • 행(Record) 단위 트리거 
  • 트리거 실행 반복
  • 사용 ex)
  • ex 1) delete 트리거
create or replace trigger tblWomen
    after 
    delete
    on tblWomen
    for each row
begin
    dbms_output.put_line('레코드를 삭제했습니다.' || :old.name);
    
end trgWomen;
/

delete from tblWomen where name = '하하하';
delete from tblWomen;
  • ex 2) insert 트리거
create or replace trigger tblWomen
    after 
    insert
    on tblWomen
    for each row
begin
    -- 상관관계(:new) > 새롭게 추가되는 행 참조 객체
    dbms_output.put_line('레코드를 추가했습니다.' || :new.name || :new.age);
end trgWomen;
/

insert into tblWomen values ('호호호', 20, 160, 50, null);
728x90
저작자표시 비영리 변경금지 (새창열림)

'데이터베이스' 카테고리의 다른 글

DATABASE STEP 36 - ACCOUNT  (0) 2023.03.30
DATABASE STEP 35 - INDEX  (0) 2023.03.30
DATABASE STEP 33 - STORED FUNCTION  (0) 2023.03.29
DATABASE STEP 32 - PROCEDURE  (0) 2023.03.28
DATABASE STEP 31 - PL/SQL  (0) 2023.03.27
'데이터베이스' 카테고리의 다른 글
  • DATABASE STEP 36 - ACCOUNT
  • DATABASE STEP 35 - INDEX
  • DATABASE STEP 33 - STORED FUNCTION
  • DATABASE STEP 32 - PROCEDURE
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • 코딩테스트
  • IT자격증공부
  • java
  • IT개발자
  • 자바
  • React
  • 개발블로그
  • jquery
  • css
  • DBA
  • 백준
  • jsp
  • IT자격증
  • 알고리즘
  • html
  • 웹개발자
  • 데이터베이스
  • 정보처리기사필기
  • ajax
  • 정보처리기사
  • 프론트엔드
  • 백엔드
  • 웹페이지
  • DB
  • JavaScript
  • 정보보안전문가
  • it
  • 개발자
  • 웹개발
  • 앱개발자

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
DATABASE STEP 34 - TRIGGER
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.