오라클] 트리거(Trigger)

2017.09.05 07:00


트리거 


트리거란 특정한 사건이 발생될 때마다 자동으로 실행되는 PL/SQL 블록이다. 


트리거의 문법은 아래와 같다.


CREATE [OR REPLACE] TRIGGER 트리거_이름 

BEFORE | AFTER -- 트리거가 실행되는 시점이 EVENT의 전 또는 후 지정

EVENT

ON {Table_name | view_name | SCHEMA | DATABASE} -- 이벤트가 일어나는 대상

FOR EACH ROW  

WHEN  -- 필요한 경우 조건절 부여

  triger문




트리거 관리


ㅇ 활성화 / 비활성화

ALTER TRIGGER 트리거_이름 {DISABLE | ENABLE}



ㅇ 테이블에 속한 트리거 활성화 / 비활성화

ALTER TABLE 테이블_이름 {DISABLE | ENABLE} ALL TRIGGER;



ㅇ 트리거 수정 후 재컴파일

ALTER TRIGGER 트리거_이름 COMPILE;



ㅇ 트리거 삭제

DROP TRIGGER 트리거_이름;



ㅇ 트리거 조회

SELECT * FROM USER_TRIGGERS;





트리거 실습



-- scott계정에게 트리거를 만들 수 있는 권한 부여


1
2
3
4
SYS @ SQL > GRANT CREATE TRIGGER TO SCOTT;
 
권한이 부여되었습니다.
 
cs




-- 데이터가 입력될 test01 테이블 생성


1
2
3
4
5
6
7
8
9
10
11
12
13
SCOTT @ SQL > CREATE TABLE TEST01(
      NO number NOT NULL,
      NAME VARCHAR(10),
      A number,
      B number);  
 
테이블이 생성되었습니다.
 
SCOTT @ SQL > select count(*) from test01;        
 
  COUNT(*)
----------
     0
cs




-- 트리거로 데이터가 입력될 test02 테이블 생성


1
2
3
SCOTT @ SQL > CREATE TABLE test02 AS SELECT * FROM test01 WHERE 1=2;
 
테이블이 생성되었습니다.
cs




-- 트리거 생성


1
2
3
4
5
6
7
8
9
10
11
SCOTT @ SQL > CREATE OR REPLACE TRIGGER INSERT_test02 
    AFTER INSERT ON test01 
    FOR EACH ROW 
    DECLARE 
    BEGIN 
      INSERT INTO test02
      VALUES (:NEW.no, :NEW.NAME, :NEW.A, :NEW.B); 
    END;     
    /
 
트리거가 생성되었습니다.
cs



-- sql*loader로 데이터 입력


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[oracle@OEL73:~]$ cat trg_test.ctl
LOAD DATA 
INFILE *    
APPEND
INTO TABLE test01 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(NO, NAME, A, B)
 
BEGINDATA
1,강보람, 1020     
2,"나동구"2030       
3,라한순,30. 40
[oracle@OEL73:~]$ 
[oracle@OEL73:~]$ 
[oracle@OEL73:~]$ 
[oracle@OEL73:~]$ sqlldr userid=scott/tiger control='trg_test.ctl'
 
SQL*Loader: Release 11.2.0.1.0 - Production on 일 9월 3 18:01:52 2017
 
Copyright (c) 19822009, Oracle and/or its affiliates.  All rights reserved.
 
커밋 시점에 도달 - 논리 레코드 개수 3
[oracle@OEL73:~]$ 
cs



 -- 트리거 동작여부 확인


1
2
3
4
5
6
7
8
9
10
11
12
13
SCOTT @ SQL > select * from test01;
 
    NO NAME            A      B
---------- ---------- ---------- ----------
         1 강보람             10         20
         2 나동구             20         30
 
SCOTT @ SQL > select * from test02;
 
    NO NAME            A      B
---------- ---------- ---------- ----------
         1 강보람             10         20
         2 나동구             20         30
cs



-- 데이터 추가 입력(sql*loader 수정)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[oracle@OEL73:~]$ cat trg_test.ctl
LOAD DATA 
INFILE *    
APPEND
INTO TABLE test01 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(NONAMEA, B)
 
BEGINDATA
3,라한순,3040
4,마봉춘,10,10
5,사공팔,20,20
6,아저씨,20,30
7,차승원,30,30
[oracle@OEL73:~]$ sqlldr userid=scott/tiger control='trg_test.ctl'
 
SQL*Loader: Release 11.2.0.1.0 - Production on 일 9월 3 18:10:42 2017
 
Copyright (c) 19822009, Oracle and/or its affiliates.  All rights reserved.
 
커밋 시점에 도달 - 논리 레코드 개수 5
 
 
SCOTT @ SQL > select * from test01;
 
    NO NAME            A      B
---------- ---------- ---------- ----------
         1 강보람             10         20
         2 나동구             20         30
         3 라한순             30         40
         4 마봉춘             10         10
         5 사공팔             20         20
         6 아저씨             20         30
         7 차승원             30         30
 
7 개의 행이 선택되었습니다.
 
SCOTT @ SQL > select * from test02; 
 
    NO NAME            A      B
---------- ---------- ---------- ----------
         1 강보람             10         20
         2 나동구             20         30
         3 라한순             30         40
         4 마봉춘             10         10
         5 사공팔             20         20
         6 아저씨             20         30
         7 차승원             30         30
 
7 개의 행이 선택되었습니다.
cs


또루아빠 SQL(오라클,mysql) , , , ,