프로젝트/데이터베이스

[ORACLE] 트리거 사용 예시

쿠키담임선생님 2022. 9. 28. 15:35

트리거 기본 문법


CREATE [OR REPLACE] TRIGGER 트리거이름
[AFTER/BEFORE] [update or delete]
    ON 테이블 이름
    [FOR EACH ROW] /*행 트리거 여부를 결정, DML의 영향을 받는 레코드마다 트리거 동작*/
    [WHEN 조건]
DECLARE
	선언부
 BEGIN
 	트리거 실행코드
EXCEPTION
END;

이러한 문법을 가지고 있는 트리거.

아래 예시 코드로 어떻게 쓰이는 지 확인.

기본 트리거 예시코드


아래 코드는 주말 오전 10시에서 오후 6시 사이 EMP 테이블에 DML 사용 못하게 하는 트리거이다.

CREATE OR REPLACE TRIGGER emp_dml_YHY
BEFORE INSERT OR UPDATE OR DELETE ON emp
 BEGIN
    IF((to_char(sysdate, 'DY')in ('토', '일'))AND
      (to_number(to_char(sysdate,'HH24')))>= 10 AND
      (to_number(to_char(sysdate,'HH24')))<=18) THEN
    RAISE_APPLICATION_ERROR(-20001,'주말변경불가합니다.'); /*결과값으로 출력되는 항목*/
    END IF;
    END;

이 트리거가 있으면

UPDATE emp SET sal = 0;

이라는 명령어를 주말 오전 10시에서 오후 6시 사이 실행시 오류가 나타나게 된다.

아래 코드는 명령문 실행 시 출력문으로 어떤 명령이 실행 된 것인지 알려주는 트리거이다.

CREATE OR REPLACE TRIGGER YHY_EMP
BEFORE INSERT OR UPDATE OF ename, sal OR DELETE ON emp/*emp 테이블에 있는 ename 과 sal칼럼*/
 BEGIN
  CASE
  WHEN INSERTING THEN
  		DBMS_OUTPUT.PUT_LINE('Inserting 중입니다.');
  WHEN UPDATING('sal') THEN
  		DBMS_OUTPUT.PUT_LINE('Updating sal 중입니다...');
  WHEN UPDATING('ename') THEN
  		DBMS_OUTPUT.PUT_LINE('Updating ename 중입니다...');
  WHEN DELETING THEN
  		DBMS_OUTPUT.PUT_LINE('Deleting 중입니다...');
  END CASE;
END;

이후 쿼리문으로 이런것들을 입력하면 결과값들이 다음과 같이 나온다.

INSERT INTO EMP (empno, ename) values (88, '88길동'); /*Inserting...*/
DELETE FROM EMP WHERE empno=88; /*Deleting...*/
UPDATE emp set sal = sal + 10 where empno = 7369; /*Updating sal...*/
UPDATE emp set ename = '오자바커' where empno = 7369 /*Updating ename...*/

FOR EACH LOW 절 예시


CREATE TABLE emp_yhy(
    old_sal number,
    new_sal number,
    u_date date,
    action varchar2(20)
);

위 쿼리로 테이블을 하나 생성해준다.

그리고 트리거를 하나 생성한다.

CREATE OR REPLACE TRIGGER tr_emp_update
 AFTER UPDATE OF sal on emp
   FOR EACH ROW
 BEGIN
INSERT INTO emp_yhy values(:old sal, :new sal, sysdate, 'UPDATE');
  END;

위 트리거는 EMP 테이블에 있는 sal 칼럼에 업데이트가 발생 했을 때 모든 행에 대해 old sal, new sal 을 갱신해주는 쿼리이다.

해당 트리거가 잘 작동하는 지 보기 위해 아래 쿼리르 실행해본다.

UPDATE emp SET sal = sal + 500; /*emp 테이블의 sal 칼럼을 기존보다 500씩 올리는 코드*/

이렇게 실행하면 데이터는 이런식으로 출력된다.

OLD_SALNEW_SALU_DATEACTION

800 1300 15/02/28 UPDATE
1600 2100 15/02/28 UPDATE
7777 8277 15/02/28 UPDATE
9998 10498 15/02/28 UPDATE

이런식으로 모든 열에 대해 실행된 것을 확인할 수 있다.

WHEN 절을 이용하여 조건이 맞는 경우에만 트리거가 동작


WHEN 절을 이용하여 트리거를 만들어보는 코드이다. 아래 코드.

CREATE OR REPLACE TRIGGER print_emp
BEFORE EACH ROW
  WHEN (new.sal>500) /*여기에 조건을 걸어준다.*/
DECLARE
	sal_diff number; /*아래 부분에서 사용할 변수 선언해주는 부분*/
 BEGIN
 	sal_diff := :new.sal - :old.sal;
 	dbms_output.put('OLD SALARY : ' || :old.sal);/*||문법과 : 붙이는 이유가 뭘까?*/
 	dbms_output.put(', NEW SALARY :' || :new.sal);
 	dbms_output.put_line(',급여차이' || sal_diff);
 END;