武裝
트리거 본문
- 트리거 : 데이터베이스 안의 특정 상황이나 동작, 즉 이벤트가 발생하는 경우 자동으로 실행되는 기능을 정의하는
PL/SQL 서브 프로그램이다. (내가 실행하는 것이 아니다.)
예 : 어떤 테이블의 데이터를 특정 사용자가 변경하려 할 때 해당 데이터나 사용자 기록을 확인한다든지,
상황에 따라 데이터를 변경하지 못하게 막는 것
가동하거나 종료할 때 데이터베이스 관리자 등 관련 업무자에게 메일을 보내는 기능도 구현할 수 있다.
- 장점.
1. 여러 작업을 수행하기 위해서 서브 프로그램을 일일히 실행해야 하는 번거로움을 줄일 수 있다.
2. 제약 조건만으로 구현이 어렵거나 불가능한 좀 더 복잡한 규칙을 정할 수 있다.
3. 일련의 정보를 기록해둘 수 있으므로 여러 사용자가 공유하는 데이터 보안성과 안정성
그리고 문제가 발생했을 때 대처 능력을 높일 수 있다.
- 단점 : 무분별하게 사용면 데이터베이스 성능을 떨어뜨리는 원인이 되므로 주의가 필요
DML 트리거 | INSERT, UPDATE, DELETE와 같은 DML 명령어를 기점으로 동작함 |
DDL 트리거 | CREATE, ALTER, DROP과 같은 DDL 명령어를 기점으로 동작함 |
INSTEAD OF 트리거 | 뷰(View)에 사용하는 DML 명령어를 기점으로 동작함 |
시스템(system) 트리거 | 데이터베이스나 스키마 이벤트로 동작함 |
단순(simple) 트리거 | 다음 각 시점(timing point)에 동작함 - 트리거를 작동시킬 문장이 실행되기 전 시점 - 트리거를 작동시킬 문장이 실행된 후 시점 - 트리거를 작동시킬 문장이 행에 영향을 미치기 전 시점 - 트리거를 작동시킬 문장이 행에 영향을 준 후 시점 |
복합(compund) 트리거 | 단순 트리거의 여러 시점에 동작함 |
- DML 트리거 형식
CREATED [OR REPLACE] TRUGGER 트리거 이름
BEFORE | AFTER
INSERT | UPDATE | DELETE ON 테이블 이름
REFERENCING OLD as old | New as new // 생략 가능
FOR EACH ROW WHEN 조건식
FOLLOWS 트리거 이름2, 트리거 이름3, ...
ENABLE | DISABLE
DECLARE
선언부
BEGIN
실행부
EXCEPTION
예외 처리부
END;
FOR EACH ROW WHEN 조건식:
- 트리거를 실행하는 DML 문장에 한 번만 실행할지 DML 문장에 의해 영향 받는 행별로 실행할지를 지정한다.
- 생략하면 트리거는 DML 명령어가 실행할 때 한 번만 실행한다.
- 생략하지 않고 사용할 경우, DML 명령어에 영향받는 행별로 트리거를 작동하되 WHEN키워드를 함께 사용하면
DML 명령어에 영향받는 행 중 트리거를 작동시킬 행을 조건식으로 지정할 수 있다.
트리거 사용 (BEFORE) - 실행 전 자동으로 진행
CREATE OR REPLACE TRIGGER ENP_TRIGGER
BEFORE INSERT ON EMP_TRG
BEGIN -- 이벤트 발생 시 실행 코드
DBMS_OUTPUT.PUT_LINE('신입사원 입사');
END;
작성 후, INSERT 이벤트를 진행하면, 신입사원 입사라는 말이 출력된다.
트리거 사용 (AFTER) - DML 명령어가 실행된 후 작동
// 자동으로 INSERT 하는 트리거
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;
- :new.empno 신규로 작성이 된 해당 열의 값
- 커밋 전 롤백을 하게 되면 EMP_TRG 와 TRG_EMP_LOG는 이전으로 돌아가게 된다. d
'프로그래머로 레벨업! > 데이터베이스' 카테고리의 다른 글
레코드와 컬렉션 (0) | 2024.04.11 |
---|---|
PL/SQL구조 (0) | 2024.04.11 |
DB -> 자바로 옮겨서 작성 방법 (0) | 2024.04.11 |
데이터 모델링(데이터 설계) (0) | 2024.04.08 |
사용자, 권한, 롤 관리 (0) | 2024.04.08 |