관리 메뉴

武裝

트리거 본문

프로그래머로 레벨업!/데이터베이스

트리거

zeechive 2024. 4. 11. 14:06

- 트리거 : 데이터베이스 안의 특정 상황이나 동작, 즉 이벤트가 발생하는 경우 자동으로 실행되는 기능을 정의하는 

                PL/SQL 서브 프로그램이다. (내가 실행하는 것이 아니다.) 

  예 : 어떤 테이블의 데이터를 특정 사용자가 변경하려 할 때 해당 데이터나 사용자 기록을 확인한다든지, 

        상황에 따라 데이터를 변경하지 못하게 막는 것

        가동하거나 종료할 때 데이터베이스 관리자 등 관련 업무자에게 메일을 보내는 기능도 구현할 수 있다.

 

- 장점. 

 1. 여러 작업을 수행하기 위해서 서브 프로그램을 일일히 실행해야 하는 번거로움을 줄일 수 있다.

 2. 제약 조건만으로 구현이 어렵거나 불가능한 좀 더 복잡한 규칙을 정할 수 있다. 

 3. 일련의 정보를 기록해둘 수 있으므로 여러 사용자가 공유하는 데이터 보안성과 안정성 

     그리고 문제가 발생했을 때 대처 능력을 높일 수 있다.

 

- 단점 : 무분별하게 사용면 데이터베이스 성능을 떨어뜨리는 원인이 되므로 주의가 필요

DML 트리거 INSERT, UPDATE, DELETE와 같은 DML 명령어를 기점으로 동작함
DDL 트리거 CREATE, ALTER, DROP과 같은 DDL 명령어를 기점으로 동작함
INSTEAD OF 트리거 뷰(View)에 사용하는 DML 명령어를 기점으로 동작함
시스템(system) 트리거 데이터베이스나 스키마 이벤트로 동작함
단순(simple) 트리거 다음 각 시점(timing point)에 동작함
- 트리거를 작동시킬 문장이 실행되기 전 시점
- 트리거를 작동시킬 문장이 실행된 후 시점
- 트리거를 작동시킬 문장이 행에 영향을 미치기 전 시점
- 트리거를 작동시킬 문장이 행에 영향을 준 후 시점
복합(compund) 트리거 단순 트리거의 여러 시점에 동작함

 

 

 

- DML 트리거 형식

 

CREATED [OR REPLACE] TRUGGER 트리거 이름
BEFORE | AFTER
INSERT | UPDATE | DELETE ON 테이블 이름
REFERENCING OLD as old | New as new   // 생략 가능 
FOR EACH ROW WHEN 조건식
FOLLOWS 트리거 이름2, 트리거 이름3, ...
ENABLE | DISABLE

DECLARE
	선언부
BEGIN
	실행부
EXCEPTION
	예외 처리부
END;

FOR EACH ROW WHEN 조건식:
  -  트리거를 실행하는 DML 문장에 한 번만 실행할지 DML 문장에 의해 영향 받는 행별로 실행할지를 지정한다.
  -  생략하면 트리거는 DML 명령어가 실행할 때 한 번만 실행한다.
  - 생략하지 않고 사용할 경우, DML 명령어에 영향받는 행별로 트리거를 작동하되 WHEN키워드를 함께 사용하면

     DML 명령어에 영향받는 행 중 트리거를 작동시킬 행을 조건식으로 지정할 수 있다.

 

 

트리거 사용 (BEFORE) - 실행 전 자동으로 진행 

CREATE OR REPLACE TRIGGER ENP_TRIGGER
    BEFORE INSERT ON EMP_TRG
    
    BEGIN -- 이벤트 발생 시 실행 코드 
    DBMS_OUTPUT.PUT_LINE('신입사원 입사');

END;

 

작성 후, INSERT 이벤트를 진행하면, 신입사원 입사라는 말이 출력된다. 

 

 

 

 

 

트리거 사용 (AFTER) - DML 명령어가 실행된 후 작동


// 자동으로 INSERT 하는 트리거 
CREATE OR REPLACE TRIGGER trg_emp_log
AFTER
INSERT OR UPDATE OR DELETE ON EMP_TRG
FOR EACH ROW

BEGIN

   IF INSERTING THEN
      INSERT INTO emp_trg_log
      VALUES ('EMP_TRG', 'INSERT', :new.empno,SYS_CONTEXT('USERENV', 'SESSION_USER'), sysdate);

   ELSIF UPDATING THEN
      INSERT INTO emp_trg_log
      VALUES ('EMP_TRG', 'UPDATE', :old.empno,SYS_CONTEXT('USERENV', 'SESSION_USER'), sysdate);

   ELSIF DELETING THEN
      INSERT INTO emp_trg_log
      VALUES ('EMP_TRG', 'DELETE', :old.empno,SYS_CONTEXT('USERENV', 'SESSION_USER'), sysdate);
   END IF;
END;

 - :new.empno 신규로 작성이 된 해당 열의 값 

 

- 커밋 전 롤백을 하게 되면 EMP_TRG 와 TRG_EMP_LOG는 이전으로 돌아가게 된다. d

'프로그래머로 레벨업! > 데이터베이스' 카테고리의 다른 글

레코드와 컬렉션  (0) 2024.04.11
PL/SQL구조  (0) 2024.04.11
DB -> 자바로 옮겨서 작성 방법  (0) 2024.04.11
데이터 모델링(데이터 설계)  (0) 2024.04.08
사용자, 권한, 롤 관리  (0) 2024.04.08