Oracle PL/SQL 강좌
Trigger(트리거) 21 18 99,999+

by 구루비 TRIGGER 트리거 FOR EACH ROW [2002.01.20]


트리거란?

  INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때 묵시적으로 수행되는 PROCEDURE 이다.

  트리거는 TABLE과는 별도로 DATABASE에 저장 된다.

  트리거는 VIEW에 대해서가 아니라 TABLE에 관해서만 정의 될 수 있다.

  행 트리거 : 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행되며, 그 데이터 행의 실제값을 제어할 수 있다.

  문장 트리거 : 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어 할 수 없다.

트리거 문법

  • - BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행 된다.
  • - AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행 된다.
  • - trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있다.
  • - FOR EACH ROW : 이 옵션이 있으면 행 트리거가 된다.

간단한 트리거 예제 1

 
SQL> CREATE OR REPLACE TRIGGER triger_test
       BEFORE
       UPDATE ON dept
       FOR EACH ROW
	   
	   BEGIN
        DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값 : ' || : old.dname);
        DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값 : ' || : new.dname);
     END;
     /

-- DBMS_OUTPUT.PUT_LINE을 출력
SQL> SET SERVEROUTPUT ON ; 

-- UPDATE문을 실행시키면.. 
SQL> UPDATE dept SET dname = '총무부' WHERE deptno = 30

-- 트리거가 자동 실행되어 결과가 출력된다. 
변경 전 컬럼 값 : 인사과
변경 후 컬럼 값 : 총무부

1 행이 갱신되었습니다.
    

간단한 트리거 예제 2

 
SQL> CREATE OR REPLACE TRIGGER sum_trigger
       BEFORE
       INSERT OR UPDATE ON emp
       FOR EACH ROW

    DECLARE
	
        -- 변수를 선언할 때는 DECLARE문을 사용해야 한다 
        avg_sal NUMBER;
	
    BEGIN
	
        SELECT ROUND(AVG(sal),3)
        INTO avg_sal
        FROM emp;

        DBMS_OUTPUT.PUT_LINE('급여 평균 : ' || avg_sal);
	
    END; 
    /

-- DBMS_OUTPUT.PUT_LINE을 출력
SQL> SET SERVEROUTPUT ON ;

-- INSERT문을 실행해보자.
SQL> INSERT INTO EMP(EMPNO, ENAME, JOB, HIREDATE, SAL)
     VALUES(1000, 'LION', 'SALES', SYSDATE, 5000);

-- INSERT문을 실행되기 전까지의 급여 평균이 출력된다. 
급여 평균 : 2073.214

1 개의 행이 만들어졌습니다.
    

- 강좌 URL : http://www.gurubee.net/lecture/1076

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by s\ [2004.08.25 11:00:50]
old.dname 또는 new.dname에서 앞에 ':'와 사이가 덜어져 있으면 에러남다..

by ben337 [2005.11.30 09:16:10]
trigger는 commit 하지 않아도 자동 commit 됩니다.

by 김정식 [2006.02.17 16:57:36]
◈ 트리거의 제한

트리거는 트랜잭션 제어문(COMMIT, ROLLBACK, SAVEPOINT)을 사용할 수 없습니다.
트리거는 트리거링 문장의 실행부분으로써 실행되고 트리거링 문장과 같은 트랜잭션에 있습니다.
트리거링 문장이 COMMIT, ROLLBACK될때 트리거의 작업도 COMMIT, ROLLBACK 됩니다.

by 손님 [2007.01.19 09:15:05]
음. 트리거링 문장이라는게 어떤 건가요? 업무단 insert table(여기에는 트리거가 걸려있다고 치고) 의 sql문장이 rollback되면. trigger의 문장들도 다 rollback된다는 이야기죠..

by 풍동 [2009.05.25 15:27:42]
ON 다음에 띄워쓰기 없으면 ON 키워드가 없다고 에러나네요

by Beginner [2009.07.22 00:27:21]
생성한 트리거를 삭제하려면 어떻게 하죠?

by kimsg06 [2009.07.26 04:17:21]
delete triger triger_name; 하면 지워 질걸요

by 가락 [2010.10.28 10:27:13]
트리거 예외사항에 대한 부분이 없는데 추가해 주시면 안될까요?
NODATA 등...

by 손님 [2011.01.04 21:44:39]
:old.dname 이랑 :new.dname에 의미가 먼지 궁금하네요.

by 손님 [2011.09.08 11:36:35]
:old.dname 이랑 :new.dname은 말그대로 예전dname 데이터 현재 dname데이터를 얘기합니다.

by 손님 [2012.11.02 14:35:20]

드디어 한번 다봤다 ㅎㅎ 잘보가감니다 ^^ 도움많이 됬어요

by 깨비 [2013.03.27 17:07:04]

Thank you so much~

by 손님 [2013.05.28 11:16:36]

트리거는 주로 어떨때 사용 되나요??


by 부쉬맨 [2013.05.28 12:38:55]
master detail 이존재한다면

master
전화번호가 변경되었다면

detail 에 전화번호가 변경되어진 이력을 쌓아야된다면

이러한 master 가 update 되고
datail 에는 insert 가 되어야되는데

그걸 master 테이블에 트리거를 걸어둔다면
이력은 자동으로 쌓이게되는 부분으로 간단히 설명할수 있겟네요

by 신화씨앤씨 [2014.02.19 21:29:12]

감사합니다


by 상유니 [2015.08.13 19:05:46]

문장트리거 예제가 없는걸 보니 별로 쓸 일이 없나 보아요.


by Zester [2019.12.20 15:37:34]

감사 댓글 달려고 가입했네요.

 

PLSQL 막막했는데 이 강좌로 시작 할 수 있어서 다행입니다!

 

감사합니다 :)


by 재미지개 [2020.07.01 15:19:18]

트리거에서 현재 로그인한 session의 값을 설정하는 방법은 없나요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입