본문 바로가기
Be Smart/SQL

[오라클] Oracle DB 트리거 생성/예시 및 활용

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

트리거(Trigger)의 활용과 고려사항

트리거(Trigger)의 활용

1. 데이터 무결성 강화

  • 전체 데이터베이스에 걸쳐 영향 받은 테이블을 연속적으로 변경함으로써 데이터 무결성을 강화하는데 사용될 수 있습니다.
  • 중복되었거나 파생된 데이터에 대해 트리거를 사용하는 것이 좋습니다.

2. 참조 무결성 강화

  • 연속적인 삭제 / 갱신이 일어날 필요가 있을 때 적절한 작업을 하도록 보장하는데 유용합니다.
  • FOREIGN KEY, REFERENCE 제약을 사용할 수도 있습니다.
  • 자신의 오류 메시지를 정의할 수 있습니다.

3. 업무 규칙 설정

  • 제약에 의해 표현될 수 있는 것보다 복잡한 제약을 표현할 수 있습니다.

4. 감사 기능 확장

  • 상세한 변경 내역을 추적하려면, 트리거를 적용하거나 Log Miner를 이용해 아카이브 로그를 뒤지는 수밖에 없습니다.
  • 감사 목적으로 적용되는 트리거는 성능적으로 심각한 부담을 줄 수 있습니다.

트리거 고려사항

  • 트리거는 각 테이블에 최대 3개까지 존재할 수 있습니다. (UPDATE, INSERT, DELETE 트리거가 각각 하나씩)
  • 이미 트리거가 정의된 작업에 대해 다른 트리거를 정의하면 기존의 것을 대체합니다.
  • 테이블의 소유자만이 트리거를 생성하거나 삭제할 수 있습니다.
  • 뷰나 임시 테이블을 참조할 수 있으나, 뷰나 임시 테이블에 대해 생성할 수는 없습니다.
  • 데이터 무결성이나 업무 규칙 처리에만 사용하는 것이 좋습니다.
  • 트리거의 동작은 이를 삭제하지 않는 한 계속됩니다.
  • 테이블의 삭제는 관련 트리거의 삭제를 유발합니다.

트리거(Trigger)
INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때 묵시적으로 수행되는 프로시저.

트리거 생성/예시

CREATE OR REPLACE TRIGGER 트리거이름(영문)
BEFORE | AFTER INSERT | UPDATE | DELETE ON 테이블명
[FOR EACH ROW]
[WHEN(조건)]
DECLARE
  -- 변수선언
  ...
BEGIN
  ...
[EXCEPTION]
  -- 예외사항
END 트리거이름(영문);

예시:

-- TEST_EXAMPLE_TB
-- 컬럼 seq_num, data1, data2

CREATE OR REPLACE TRIGGER trg_tb_test01
BEFORE
INSERT ON TEST_EXAMPLE_TB
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('트리거 테스트입니다.');
END trg_tb_test01;

-- 실행 --
INSERT INTO TEST_EXAMPLE_TB
VALUES (11, 'test123', 'test234');

-- 결과 --
-- OUTPUT
트리거 테스트입니다.

트리거 선언 시 주요 사항:

  • BEFORE: INSERT, UPDATE 또는 DELETE문이 실행되기 전에 트리거가 실행
  • AFTER: INSERT, UPDATE 또는 DELETE문이 실행된 후 트리거가 실행
  • FOR EACH ROW: 행 트리거가 된다는 것

조건부와 DECLARE 선언부는 기존의 PL/SQL 사용 부분과 같습니다.

트리거 삭제:

DROP TRIGGER trg_tb_test01;

트리거 참고:
변경 전 컬럼 값과 변경 후 컬럼 값을 알 수 있습니다.

  • :old.컬럼명
  • :new.컬럼명
CREATE OR REPLACE TRIGGER trg_tb_test02
BEFORE
UPDATE ON TEST_EXAMPLE_TB
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('변경 전 값 = ' || :OLD.data1 );
  DBMS_OUTPUT.PUT_LINE('변경 후 값 = ' || :NEW.data1 );
END trg_tb_test02;

-- 실행 --
UPDATE TEST_EXAMPLE_TB
SET data1 = 'replace_text123'
WHERE SEQ_NUM = 11;

-- 결과 --
-- OUTPUT
변경 전 값 = test123
변경 후 값 = replace_text123
728x90

댓글