CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE | AFTER
INSERT OR UPDATE OR DELETE
ON 테이블명
FOR EACH ROW
BEGIN
트리거본문
END;
-- 서버 메시지 출력 ON
SET SERVEROUTPUT ON;
-- HR 계정으로 접속 후 확인
CREATE OR REPLACE TRIGGER TRIG1
AFTER
UPDATE
ON EMPLOYEES
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
END;
UPDATE EMPLOYEES
SET LAST_NAME = 'Queen'
WHERE EMPLOYEE_ID = 100;
DROP TRIGGER TRIG1;
CREATE OR REPLACE TRIGGER TRIG2
AFTER
INSERT OR UPDATE OR DELETE -- 순서 상관 없음
ON EMPLOYEES
FOR EACH ROW
BEGIN
IF INSERTING THEN -- 삽입 후 동작할 작업
DBMS_OUTPUT.PUT_LINE('INSERT를 했군요.');
ELSIF UPDATING THEN -- 수정 후 동작할 작업
DBMS_OUTPUT.PUT_LINE('UPDATE를 했군요.');
ELSIF DELETING THEN -- 삭제 후 동작할 작업
DBMS_OUTPUT.PUT_LINE('DELETE를 했군요.');
END IF;
END;
INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID) VALUES(99, 'A', 'A', SYSDATE, 'A');
UPDATE EMPLOYEES SET FIRST_NAME = 'Kim' WHERE EMPLOYEE_ID = 99;
DELETE FROM EMPLOYEES WHERE EMPLOYEE_ID = 99;
DROP TRIGGER TRIG2;
CREATE OR REPLACE TRIGGER TRIG3
AFTER
UPDATE OR DELETE
ON EMPLOYEES
FOR EACH ROW
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('수정 전 LAST_NAME : ' || :OLD.LAST_NAME);
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('삭제 전 LAST_NAME : ' || :OLD.LAST_NAME);
END IF;
END;
UPDATE EMPLOYEES SET LAST_NAME = 'Kim' WHERE EMPLOYEE_ID = 100;
DELETE FROM EMPLOYEES WHERE EMPLOYEE_ID = 100;
DROP TRIGGER TRIG3;
사원 테이블에서 삭제할 사원정보를 퇴사자 테이블로 삽입하는 RETIRE_TRIG 생성하기
작업 순서
1. 사원(EMPLOYEES) 테이블의 구조를 복사하여 퇴사자(RETIRES) 테이블을 생성한다.
2. 퇴사자(RETIRES) 테이블에 퇴사번호(RETIRE_ID), 퇴사일자(RETIRE_DATE) 칼럼을 추가한다.
3. 퇴사번호(RETIRE_ID) 칼럼을 기본키로 지정한다.
4. 퇴사번호를 생성할 RETIRE_SEQ 시퀀스를 생성한다.
5. RETIRE_TRIG 트리거를 생성한다.
1) AFTER DELETE 트리거
2) OLD 테이블의 데이터를 모두 퇴사자 테이블로 삽입한다.
3) 퇴사번호는 시퀀스, 퇴사일자는 SYSDATE로 처리해서 삽입한다.
-- 1. 사원(EMPLOYEES) 테이블의 구조를 복사하여 퇴사자(RETIRES) 테이블을 생성한다.
DROP TABLE RETIRES;
CREATE TABLE RETIRES
AS (SELECT * FROM EMPLOYEES WHERE 1 = 2); -- WHERE 1 = 2를 만족하는 행(row)은 없으므로 어떤 행도 복사되지 않는다. 오직 열(column)만 복사된다.
-- 2. 퇴사자(RETIRES) 테이블에 퇴사번호(RETIRE_ID), 퇴사일자(RETIRE_DATE) 칼럼을 추가한다.
ALTER TABLE RETIRES ADD RETIRE_ID NUMBER NOT NULL;
ALTER TABLE RETIRES ADD RETIRE_DATE DATE NULL;
-- 3. 퇴사번호(RETIRE_ID) 칼럼을 기본키로 지정한다.
ALTER TABLE RETIRES
ADD CONSTRAINT PK_RETIRE PRIMARY KEY(RETIRE_ID);
-- 4. 퇴사번호를 생성할 RETIRE_SEQ 시퀀스를 생성한다.
DROP SEQUENCE RETIRE_SEQ;
CREATE SEQUENCE RETIRE_SEQ ORDER;
-- 5. RETIRE_TRIG 트리거를 생성한다.
CREATE OR REPLACE TRIGGER RETIRE_TRIG
AFTER
DELETE
ON EMPLOYEES
FOR EACH ROW
BEGIN
INSERT INTO RETIRES (
RETIRE_ID
, RETIRE_DATE
, EMPLOYEE_ID
, FIRST_NAME
, LAST_NAME
, EMAIL
, PHONE_NUMBER
, HIRE_DATE
, JOB_ID
, SALARY
, COMMISSION_PCT
, MANAGER_ID
, DEPARTMENT_ID
) VALUES (
RETIRE_SEQ.NEXTVAL
, SYSDATE
, :OLD.EMPLOYEE_ID
, :OLD.FIRST_NAME
, :OLD.LAST_NAME
, :OLD.EMAIL
, :OLD.PHONE_NUMBER
, :OLD.HIRE_DATE
, :OLD.JOB_ID
, :OLD.SALARY
, :OLD.COMMISSION_PCT
, :OLD.MANAGER_ID
, :OLD.DEPARTMENT_ID
);
END;
-- RETIRE_TRIG 동작 확인
DELETE FROM EMPLOYEES WHERE EMPLOYEE_ID BETWEEN 150 AND 200;