오라클 트리거란? DML 트리거의 사용법과 관리 방법
트리거란?
오라클에서 트리거는 데이터베이스 안의 특정 상황이나 동작, 즉 이벤트가 발생할 경우 자동으로 실행되는 기능을 정의하는 PL/SQL 서브 프로그램입니다. 예를 들어, 어떤 테이블의 데이터를 특정 사용자가 변경하려 할 때 해당 데이터나 사용자 기록을 확인하거나, 데이터베이스 관리자에게 메일을 보내는 기능도 구현할 수 있습니다.
트리거의 장점
- 연관 데이터 작업 간편화: 여러 PL/SQL 문 또는 서브 프로그램을 일일이 실행할 필요 없이 데이터 관련 작업을 간편하게 수행할 수 있습니다.
- 복잡한 규칙 구현: 제약 조건만으로는 구현이 어려운 복잡한 규칙을 정의할 수 있어 더 높은 수준의 데이터 정의가 가능합니다.
- 데이터 보안성 및 안정성 강화: 데이터 변경과 관련된 일련의 정보를 기록하여 여러 사용자가 공유하는 데이터의 보안성과 안정성을 높일 수 있습니다.
하지만 트리거는 무분별하게 사용하면 데이터베이스 성능을 저하시키는 원인이 될 수 있으므로 주의가 필요합니다.
트리거의 종류와 이벤트
트리거는 다음과 같은 이벤트에 동작을 지정할 수 있습니다.
- 데이터 조작어(DML): INSERT, UPDATE, DELETE
- 데이터 정의어(DDL): CREATE, ALTER, DROP
- 데이터베이스 동작: SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN
트리거의 종류
- DML 트리거: INSERT, UPDATE, DELETE와 같은 DML 명령어를 기준으로 동작합니다.
- DDL 트리거: CREATE, ALTER, DROP과 같은 DDL 명령어를 기준으로 동작합니다.
- INSTEAD OF 트리거: 뷰(View)에 사용하는 DML 명령어를 기준으로 동작합니다.
- 시스템 트리거: 데이터베이스나 스키마 이벤트로 동작합니다.
- 단순 트리거: 특정 시점에 동작합니다.
- 복합 트리거: 단순 트리거의 여러 시점에 동작합니다.
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
'Be Smart > SQL' 카테고리의 다른 글
[오라클] Oracle DB 트리거 생성/예시 및 활용 (0) | 2024.07.15 |
---|---|
[Oracle] 오라클 DB에서 삭제한 데이터 복구 방법 (0) | 2024.07.09 |
[오라클] PL/SQL 패키지: 이해와 활용 방법 (0) | 2024.07.03 |
[Oracle] 오라클 함수와 프로시저의 차이점 및 함수 생성과 사용 방법 (0) | 2024.07.02 |
[오라클] 저장 프로시저(Stored Procedure) 사용 가이드 (0) | 2024.07.01 |
댓글