본문 바로가기
Be Smart/SQL

[오라클] 오라클 트리거란? DML 트리거의 사용법과 관리 방법

by 반월하 2024. 7. 4.
728x90

오라클 트리거란? DML 트리거의 사용법과 관리 방법

트리거란?

오라클에서 트리거는 데이터베이스 안의 특정 상황이나 동작, 즉 이벤트가 발생할 경우 자동으로 실행되는 기능을 정의하는 PL/SQL 서브 프로그램입니다. 예를 들어, 어떤 테이블의 데이터를 특정 사용자가 변경하려 할 때 해당 데이터나 사용자 기록을 확인하거나, 데이터베이스 관리자에게 메일을 보내는 기능도 구현할 수 있습니다.

트리거의 장점

  1. 연관 데이터 작업 간편화: 여러 PL/SQL 문 또는 서브 프로그램을 일일이 실행할 필요 없이 데이터 관련 작업을 간편하게 수행할 수 있습니다.
  2. 복잡한 규칙 구현: 제약 조건만으로는 구현이 어려운 복잡한 규칙을 정의할 수 있어 더 높은 수준의 데이터 정의가 가능합니다.
  3. 데이터 보안성 및 안정성 강화: 데이터 변경과 관련된 일련의 정보를 기록하여 여러 사용자가 공유하는 데이터의 보안성과 안정성을 높일 수 있습니다.

하지만 트리거는 무분별하게 사용하면 데이터베이스 성능을 저하시키는 원인이 될 수 있으므로 주의가 필요합니다.

트리거의 종류와 이벤트

트리거는 다음과 같은 이벤트에 동작을 지정할 수 있습니다.

  • 데이터 조작어(DML): INSERT, UPDATE, DELETE
  • 데이터 정의어(DDL): CREATE, ALTER, DROP
  • 데이터베이스 동작: SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN

트리거의 종류

  1. DML 트리거: INSERT, UPDATE, DELETE와 같은 DML 명령어를 기준으로 동작합니다.
  2. DDL 트리거: CREATE, ALTER, DROP과 같은 DDL 명령어를 기준으로 동작합니다.
  3. INSTEAD OF 트리거: 뷰(View)에 사용하는 DML 명령어를 기준으로 동작합니다.
  4. 시스템 트리거: 데이터베이스나 스키마 이벤트로 동작합니다.
  5. 단순 트리거: 특정 시점에 동작합니다.
  6. 복합 트리거: 단순 트리거의 여러 시점에 동작합니다.

DML 트리거의 형식과 사용법

DML 트리거 기본 형식

CREATE [OR REPLACE] TRIGGER 트리거 이름
BEFORE | AFTER
INSERT | UPDATE | DELETE ON 테이블 이름
REFERENCING OLD as old | NEW as new
FOR EACH ROW WHEN 조건식
BEGIN
    -- 실행부
END;

트리거 생성 예제

BEFORE 트리거 생성

주말에 EMP_TRG 테이블에 DML 명령어를 사용하면 오류를 발생시키고, DML 명령어 실행을 취소하는 트리거를 생성합니다.

CREATE OR REPLACE TRIGGER trg_emp_nodml_weekend
BEFORE INSERT OR UPDATE OR DELETE ON EMP_TRG
BEGIN
   IF TO_CHAR(sysdate, 'DY') IN ('토', '일') THEN
      IF INSERTING THEN
         raise_application_error(-20000, '주말 사원정보 추가 불가');
      ELSIF UPDATING THEN
         raise_application_error(-20001, '주말 사원정보 수정 불가');
      ELSIF DELETING THEN
         raise_application_error(-20002, '주말 사원정보 삭제 불가');
      ELSE
         raise_application_error(-20003, '주말 사원정보 변경 불가');
      END IF;
   END IF;
END;
/

AFTER 트리거 생성

DML 명령어가 실행된 후 작동하는 트리거를 생성합니다. EMP_TRG 테이블에 DML 명령어가 실행되었을 때, 해당 정보를 EMP_TRG_LOG 테이블에 저장합니다.

CREATE OR REPLACE TRIGGER trg_emp_log
AFTER INSERT OR UPDATE OR DELETE ON EMP_TRG
FOR EACH ROW
BEGIN
   IF INSERTING THEN
      INSERT INTO emp_trg_log VALUES ('EMP_TRG', 'INSERT', :new.empno, SYS_CONTEXT('USERENV', 'SESSION_USER'), sysdate);
   ELSIF UPDATING THEN
      INSERT INTO emp_trg_log VALUES ('EMP_TRG', 'UPDATE', :old.empno, SYS_CONTEXT('USERENV', 'SESSION_USER'), sysdate);
   ELSIF DELETING THEN
      INSERT INTO emp_trg_log VALUES ('EMP_TRG', 'DELETE', :old.empno, SYS_CONTEXT('USERENV', 'SESSION_USER'), sysdate);
   END IF;
END;
/

트리거 관리

트리거 정보 조회

트리거 정보를 확인하려면 USER_TRIGGERS 데이터 사전을 조회합니다.

SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_NAME, STATUS
  FROM USER_TRIGGERS;

트리거 상태 변경

ALTER TRIGGER 명령어를 사용하여 트리거 상태를 변경할 수 있습니다.

ALTER TRIGGER 트리거 이름 ENABLE | DISABLE;

특정 테이블과 관련된 모든 트리거의 상태를 변경하려면 ALTER TABLE 명령어를 사용합니다.

ALTER TABLE 테이블 이름 ENABLE ALL TRIGGERS;
ALTER TABLE 테이블 이름 DISABLE ALL TRIGGERS;

트리거 삭제

DROP문을 사용하여 트리거를 삭제할 수 있습니다.

DROP TRIGGER 트리거 이름;

이 글을 통해 오라클 트리거의 기본 개념과 DML 트리거의 사용법, 그리고 트리거 관리 방법에 대해 알아보았습니다. 각종 트리거를 활용하여 데이터베이스의 보안성과 효율성을 높여보세요.

이런 자료를 참고했어요.
[1] velog - 오라클로 배우는 데이터베이스 입문/19강-저장 서브프로그램 (https://velog.io/@mini_mouse_/%EC%98%A4%EB%9D%BC%ED%81%B4%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9E%85%EB%AC%B819%EA%B0%95-%EC%A0%80%EC%9E%A5-%EC%84%9C%EB%B8%8C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8)
[2] Naver Blog - [오라클] 트리거 TRIGGER : 네이버 블로그 (https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=xxsaintxx&logNo=20135090431)
[3] 티스토리 - [Oracle] 저장 서브프로그램 - 패키지(package), 트리거(trigger) (https://pridiot.tistory.com/140)
[4] TISTORY - PL/SQL (3) 트리거 - 초보 개발자 삔아 의 발자국 - 티스토리 (https://bbinya.tistory.com/24)

뤼튼 사용하러 가기 > https://agent.wrtn.ai/5xb91l

728x90

댓글