- Oracle Database Concepts 문서에서의 트리거 정의:
트리거(Trigger)는 데이터베이스에서 발생하는 특정 이벤트에 응답하여 자동으로 실행되는 PL/SQL 프로그램입니다. 이벤트는 테이블이나 뷰에 대한 데이터 조작 언어 (DML) 문이거나, 데이터 정의 언어 (DDL) 문이거나, 데이터베이스 이벤트 (예: 시작 또는 종료) 등이 될 수 있습니다.
- 특정 테이블 또는 뷰에 대한 모든 사용자가 실행한 DML 문 (INSERT, UPDATE, DELETE, MERGE)
- 특정 스키마/사용자 또는 데이터베이스의 모든 스키마/사용자에 의해 실행된 DDL 문 (주로 CREATE 또는 ALTER)
- 특정 스키마/사용자 또는 데이터베이스의 모든 스키마/사용자에 의해 실행된 데이터베이스 이벤트, 예를 들어 로그인/로그아웃, 오류, 또는 시작/종료
- DML Triggers는 2가지로 나뉜다.
- 문장 트리거(Statement Trigger)
- 행 트리거(Row Trigger)
문장 트리거(Statement Trigger)
행 트리거(Row Trigger)
CREATE OR REPLACE TRIGGER secure_employees
BEFORE INSERT or UPDATE or DELETE ON employees
BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') BETWEEN '08:00' AND '12:00') THEN
RAISE_APPLICATION_ERROR(-20500, 'You may insert into employees table only during business hours.');
END IF;
END;
/
UPDATE employees
SET salary = salary + 100
WHERE rownum = 1;
DROP TRIGGER secure_employees;
CREATE OR REPLACE TRIGGER restrict_salary
BEFORE INSERT OR UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) AND :NEW.salary > 15000 THEN
RAISE_APPLICATION_ERROR (-20202, 'Employee cannot earn more than $5,000.');
END IF;
END;
/
UPDATE employees
SET salary = salary + 4500
WHERE deptno = 10;
select trigger_name, trigger_body
from user_triggers;