편집 요약 없음 |
|||
(같은 사용자의 중간 판 4개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
== 트리거 == | |||
Oracle | * Oracle 트리거(Trigger)는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다. | ||
예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다. | * 예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다. | ||
=== 트리거 기본 개념 === | |||
항목 설명 | {| class="wikitable" | ||
정의 특정 이벤트에 자동으로 반응하는 데이터베이스 객체 | |+ Oracle 트리거 기본개념 | ||
|- | |||
대상 이벤트 INSERT, UPDATE, DELETE | ! 항목 !! 설명 | ||
적용 대상 행(Row-Level) / 문장(Statement-Level) | |- | ||
| 정의 || 특정 이벤트에 자동으로 반응하는 데이터베이스 객체 | |||
|- | |||
| 작동 시점 || BEFORE / AFTER / INSTEAD OF | |||
|- | |||
| 대상 이벤트 || INSERT, UPDATE, DELETE | |||
|- | |||
| 적용 대상 || 행(Row-Level) / 문장(Statement-Level) | |||
|} | |||
=== 기본 문법 === | |||
<source lang=sql> | |||
CREATE [OR REPLACE] TRIGGER 트리거명 | CREATE [OR REPLACE] TRIGGER 트리거명 | ||
29번째 줄: | 34번째 줄: | ||
/ | / | ||
</source> | |||
=== 예제 1 === | |||
: INSERT 발생 시 로그 기록 트리거 | |||
<source lang=sql> | |||
CREATE OR REPLACE TRIGGER trg_customer_insert_log | CREATE OR REPLACE TRIGGER trg_customer_insert_log | ||
43번째 줄: | 49번째 줄: | ||
END; | END; | ||
/ | / | ||
</source> | |||
CUSTOMER 테이블에 데이터가 추가될 때, CUSTOMER_LOG 테이블에 로그를 남깁니다. | * CUSTOMER 테이블에 데이터가 추가될 때, CUSTOMER_LOG 테이블에 로그를 남깁니다. | ||
---- | |||
=== 예제 2 === | |||
: 급여 변경 감지 트리거 (UPDATE) | |||
<source lang=sql> | |||
CREATE OR REPLACE TRIGGER trg_salary_change | CREATE OR REPLACE TRIGGER trg_salary_change | ||
59번째 줄: | 68번째 줄: | ||
END; | END; | ||
/ | / | ||
</source> | |||
* 급여가 변경되면 SALARY_AUDIT 테이블에 변경 전/후 정보를 기록합니다. | |||
=== 예제 3 === | |||
: DELETE 시 데이터 백업 트리거 | |||
<source lang=sql> | |||
CREATE OR REPLACE TRIGGER trg_emp_delete_backup | CREATE OR REPLACE TRIGGER trg_emp_delete_backup | ||
74번째 줄: | 84번째 줄: | ||
END; | END; | ||
/ | / | ||
</source> | |||
삭제 전 데이터를 백업 테이블로 복사합니다. | * 삭제 전 데이터를 백업 테이블로 복사합니다. | ||
실무에서 데이터 삭제 로그를 남기기 위해 자주 사용합니다. | * 실무에서 데이터 삭제 로그를 남기기 위해 자주 사용합니다. | ||
=== 트리거 종류 요약 === | |||
{| class="wikitable" | {| class="wikitable" | ||
98번째 줄: | 107번째 줄: | ||
---- | |||
=== 시스템 트리거 (고급) === | |||
Oracle은 테이블 외에도 시스템 이벤트 트리거를 지원합니다: | Oracle은 테이블 외에도 시스템 이벤트 트리거를 지원합니다: | ||
<source lang=sql> | |||
CREATE OR REPLACE TRIGGER trg_logon_example | CREATE OR REPLACE TRIGGER trg_logon_example | ||
112번째 줄: | 120번째 줄: | ||
END; | END; | ||
/ | / | ||
</source> | |||
사용자가 데이터베이스에 접속할 때마다 로그인 기록을 남깁니다. | * 사용자가 데이터베이스에 접속할 때마다 로그인 기록을 남깁니다. | ||
=== 트리거 유의사항 === | |||
{| class=”wikitable“ | |||
|- | |||
!주의사항 !! 설 명 | |||
주의사항 | |- | ||
트리거는 자동 실행되므로, 무한 루프 주의 예: 트리거에서 다시 트리거를 부르는 경우 | | 트리거는 자동 실행되므로, 무한 루프 주의 ||예: 트리거에서 다시 트리거를 부르는 경우 | ||
트리거는 성능에 영향을 줄 수 있음 많은 데이터에 작동하면 병목 발생 가능 | |- | ||
트리거는 디버깅이 어렵기 때문에 주석, 로그 중요 로그 테이블 또는 DBMS_OUTPUT 활용 권장 | | 트리거는 성능에 영향을 줄 수 있음 || 많은 데이터에 작동하면 병목 발생 가능 | ||
|- | |||
| 트리거는 디버깅이 어렵기 때문에 주석, 로그 중요 || 로그 테이블 또는 DBMS_OUTPUT 활용 권장 | |||
|- | |||
|} | |||
[[category:oracle]] | [[category:oracle]] | ||
[[category:trigger]] |
2025년 6월 23일 (월) 00:13 기준 최신판
트리거
- Oracle 트리거(Trigger)는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다.
- 예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다.
트리거 기본 개념
항목 | 설명 |
---|---|
정의 | 특정 이벤트에 자동으로 반응하는 데이터베이스 객체 |
작동 시점 | BEFORE / AFTER / INSTEAD OF |
대상 이벤트 | INSERT, UPDATE, DELETE |
적용 대상 | 행(Row-Level) / 문장(Statement-Level) |
기본 문법
CREATE [OR REPLACE] TRIGGER 트리거명 {BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON 테이블명 [FOR EACH ROW] -- 행 단위 트리거일 경우 [WHEN 조건] -- (선택적 조건) BEGIN -- 실행할 PL/SQL 블록 END; /
예제 1
- INSERT 발생 시 로그 기록 트리거
CREATE OR REPLACE TRIGGER trg_customer_insert_log AFTER INSERT ON CUSTOMER FOR EACH ROW BEGIN INSERT INTO CUSTOMER_LOG (CUST_ID, ACTION_DATE, ACTION) VALUES (:NEW.ID, SYSDATE, 'INSERT'); END; /
- CUSTOMER 테이블에 데이터가 추가될 때, CUSTOMER_LOG 테이블에 로그를 남깁니다.
예제 2
- 급여 변경 감지 트리거 (UPDATE)
CREATE OR REPLACE TRIGGER trg_salary_change BEFORE UPDATE OF SALARY ON EMPLOYEE FOR EACH ROW WHEN (OLD.SALARY != NEW.SALARY) BEGIN INSERT INTO SALARY_AUDIT (EMP_ID, OLD_SALARY, NEW_SALARY, CHANGE_DATE) VALUES (:OLD.EMP_ID, :OLD.SALARY, :NEW.SALARY, SYSDATE); END; /
- 급여가 변경되면 SALARY_AUDIT 테이블에 변경 전/후 정보를 기록합니다.
예제 3
- DELETE 시 데이터 백업 트리거
CREATE OR REPLACE TRIGGER trg_emp_delete_backup BEFORE DELETE ON EMPLOYEE FOR EACH ROW BEGIN INSERT INTO EMPLOYEE_ARCHIVE (EMP_ID, NAME, DEPT_ID, SALARY, DELETED_AT) VALUES (:OLD.EMP_ID, :OLD.NAME, :OLD.DEPT_ID, :OLD.SALARY, SYSDATE); END; /
- 삭제 전 데이터를 백업 테이블로 복사합니다.
- 실무에서 데이터 삭제 로그를 남기기 위해 자주 사용합니다.
트리거 종류 요약
종류 | 설명 | 사용 예 |
---|---|---|
BEFORE INSERT/UPDATE/DELETE | 이벤트 발생 전에 실행 | BEFORE UPDATE ON EMPLOYEE |
AFTER INSERT/UPDATE/DELETE | 이벤트 발생 후에 실행 | AFTER INSERT ON CUSTOMER |
INSTEAD OF | 뷰(View)에 직접 수정이 불가할 때 대체 실행 | INSTEAD OF INSERT ON vw_customer |
STATEMENT 트리거 | 전체 문장 1회 실행 (행마다 아님) | CREATE TRIGGER trg_all AFTER INSERT ON table |
ROW 트리거 | 각 행마다 실행됨 | FOR EACH ROW 사용 |
시스템 트리거 (고급)
Oracle은 테이블 외에도 시스템 이벤트 트리거를 지원합니다:
CREATE OR REPLACE TRIGGER trg_logon_example AFTER LOGON ON DATABASE BEGIN INSERT INTO LOGIN_AUDIT(USER_NAME, LOGIN_TIME) VALUES (USER, SYSDATE); END; /
- 사용자가 데이터베이스에 접속할 때마다 로그인 기록을 남깁니다.
트리거 유의사항
주의사항 | 설 명 |
---|---|
트리거는 자동 실행되므로, 무한 루프 주의 | 예: 트리거에서 다시 트리거를 부르는 경우 |
트리거는 성능에 영향을 줄 수 있음 | 많은 데이터에 작동하면 병목 발생 가능 |
트리거는 디버깅이 어렵기 때문에 주석, 로그 중요 | 로그 테이블 또는 DBMS_OUTPUT 활용 권장 |