메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
(새 문서: 좋습니다! Oracle 19c의 **트리거(Trigger)**는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다. 예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다. ⸻ ✅ 트리거 기본 개념 항목 설명 정의 특정 이벤트에 자동으로 반응하는 데이터베이스 객체 발동 시점 BEFORE / AFTER / INSTEAD OF 대상 이벤트 INSERT, UPDATE, DELETE 적용...)
 
편집 요약 없음
 
1번째 줄: 1번째 줄:
좋습니다!
 
Oracle 19c의 **트리거(Trigger)**는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다.
Oracle 19c의 **트리거(Trigger)**는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다.
예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다.
예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다.
125번째 줄: 125번째 줄:




 
[[category:oracle]]
 
필요하시면 복합 트리거 (compound trigger)나 트리거 상태 확인/비활성화, 또는 DML 트리거+윈도우 함수 결합 예제도 만들어 드릴 수 있습니다.
 
사용하려는 시나리오가 있다면 말씀해 주세요. 맞춤형 트리거를 설계해 드릴게요! 🔧

2025년 5월 18일 (일) 02:41 기준 최신판

Oracle 19c의 **트리거(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; /

삭제 전 데이터를 백업 테이블로 복사합니다. 실무에서 데이터 삭제 로그를 남기기 위해 자주 사용합니다.

✅ 트리거 종류 요약 (미디어위키 표)

Oracle 19c 트리거 종류 요약
종류 설명 사용 예
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 활용 권장