트리거(Trigger) 란?
- Triggering Event, 즉 Oracle DML 문인 INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때 자동으로 수행되는 PROCEDURE
- 행 트리거
- 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행
- 실제 그 데이터 행의 실제값 제어가능
- :old, :new - 문장 트리거
- 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어 할 수 없음
- 컬럼의 데이터 값에 관계없이 컬럼에 변화가 일어남을 감지하여 실행되는 트리거 - 문법
CREATE [OR REPLACE] TRIGGER trigger_name
BEFORE | AFTER
trigger_event ON table_name
[FOR EACH ROW]
[WHEN (condition)]
PL/SQL block
- BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행
- AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행
- trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있음
- FOR EACH ROW : 이 옵션이 있으면 행 트리거가 됨
- Procedure와 Trigger의 차이점
Procedure | Trigger |
생성하면 소스코드와 실행코드(P-CODE)가 생성됨 | 생성하면 소스코드와 실행코드(P-CODE)가 생성됨 |
EXECUTE 명령어로 실행 | 생성 후 자동 실행 |
COMMIT, ROLLBACK 실행 가능 | COMMIT, ROLLBACK 실행 안됨 |
- 소스 예제
CREATE OR REPLACE TRIGGER Emp_Sal_Change
BEFORE
INSERT OR UPDATE ON emp
FOR EACH ROW
WHEN (new.empno > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :new.sal - :old.sal;
DBMS_OUTPUT.PUT_LINE('이전 급여 : ' ||:old.sal);
DBMS_OUTPUT.PUT_LINE('신 급여 : ' || :new.sal);
DBMS_OUTPUT.PUT_LINE('급여 차액 : '|| sal_diff);
END;
-- Table 추적 trigger
CREATE OR REPLACE TRIGGER emp_row_aud
AFTER insert OR update OR delete ON emp
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO emp_row_audit
VALUES(emp_row_seq.NEXTVAL, :new.ename, 'inserting', SYSDATE);
ELSIF UPDATING THEN
INSERT INTO emp_row_audit
VALUES(emp_row_seq.NEXTVAL, :old.ename, 'updating', SYSDATE);
ELSIF DELETING THEN
INSERT INTO emp_row_audit
VALUES(emp_row_seq.NEXTVAL, :old.ename, 'deleting', SYSDATE);
END IF;
END;
'Database' 카테고리의 다른 글
[PL/SQL] 패키지 (Package) (0) | 2019.09.16 |
---|---|
[PL/SQL] 커서 (CURSOR) (0) | 2019.09.16 |
[PL/SQL] 기본 문법 - %TYPE, %ROWTYPE Attribute, Exception 처리 (0) | 2019.09.16 |
[PL/SQL] Function, Procedure (0) | 2019.09.11 |
[Oracle] 조건 검색 - WHERE 절 (0) | 2019.09.10 |