본문 바로가기

SQL

[Oracle] 트리거

트리거도 프로시저 입니다. 근데 왜 굳이 트리거라고 할까요? 특정 이벤트가 발생할 때 자동으로 호출되는 프로시저를 트리거라고 부르기로 했습니다.

  • 데이터 무결성 유지 
  • 감사 및 로그 기록
  • 자동화된 비즈니스 로직 적용

이런 목적으로 트리거를 활용한다고 하네요. 

 

정리하자면 프로시저는 복잡한 비즈니스 로직을 캡슐화 하여 재사용할 때 사용하고, 트리거는 주로 데이터 변경 이벤트에 반응하여 자동으로 처리해야 하는 작업을 의미합니다.

 

그럼 이벤트가 뭘까요? 주로 INSERT, UPDATE, DELETE와 같은 DML작업을 말합니다.

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
[FOR EACH ROW]
DECLARE
  -- 선언부 (선택적)
BEGIN
  -- 트리거 본문
END;

 

트리거 기본 구문입니다. 

 

전 사실 이렇게 보면 잘 모르겠어요... 뭐 생략가능하고 이게 올 수 있고 알겠는데.. 예제로 보는게 확실하달까

CREATE OR REPLACE TRIGGER before_insert_employee
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
  IF :NEW.hire_date IS NULL THEN
    :NEW.hire_date := SYSDATE;
  END IF;
END;

 

이 트리거는 새로운 행이 삽입되기 전에 실행되는데 새로운 행의 hire_date가 NULL이면 SYSDATE(현재날짜)로 설정하는 트리거 입니다. 

 

* FOR EACH ROW는 테이블의 각 행에 대해 트리거가 실행됩니다.

:NEW가 새로운 행을 참조하면 전의 행은 :OLD로 참조할 수 있습니다.

 

* 참고로 트리거는 자동 COMMIT 되기 때문에 트랜잭션 제어문을 사용할 수 없습니다.

 

* 트리거는 활성화/ 비활성화가 가능합니다.

ALTER TRIGGER trigger_name ENABLE; // 활성화
ALTER TRIGGER trigger_name DISABLE; // 비활성화

 

* IF ELSE 가능하고 IF로 시작했으면 END IF로 끝나야 합니다. 참일 떄만 실행됩니다.

'SQL' 카테고리의 다른 글

[Oracle] 프로시저  (0) 2024.06.16
[Oracle] 날짜 내장 함수  (1) 2024.06.15
[Oracle] 숫자 내장 함수  (0) 2024.06.15
[Oracle] 문자열 내장 함수  (0) 2024.06.15
[Oracle] 기초 (MySQL과의 소소한 차이)  (0) 2024.06.08