일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- javascript
- select
- 과정평가형
- CSS
- jQuery
- TO_DATE
- html
- 태그
- controller
- array
- eGov
- Java
- eGovFramework
- 암호화
- POI
- 정의
- 오류
- 함수
- jsp
- Oracle
- input
- 개념
- was
- sql
- json
- spring
- mybatis
- JVM
- Ajax
- web.xml
- Today
- Total
web developer
[oracle] 오라클 트리거(trigger) : 기본부터 실용 예제까지 본문
1. 트리거(trigger) 정의
오라클(Oracle) 데이터베이스에서 트리거(trigger)는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다. 트리거는 데이터베이스의 데이터 무결성을 유지하고, 특정 조건이 충족될 때 자동으로 작업을 수행하도록 설정할 수 있습니다.
트리거를 사용하는 이유는 다음과 같습니다:
- 데이터 무결성 유지:
- 트리거는 데이터의 정확성과 일관성을 보장하기 위해 사용됩니다. 예를 들어, 데이터 삽입, 업데이트 또는 삭제 시 특정 조건을 검사하거나 수정하여 데이터 무결성을 유지할 수 있습니다.
- 자동화된 작업 수행:
- 트리거를 사용하면 데이터 변경 시 자동으로 특정 작업을 수행할 수 있습니다. 예를 들어, 새로운 레코드가 삽입될 때 관련된 로그를 기록하거나, 특정 필드를 자동으로 업데이트할 수 있습니다.
- 복잡한 비즈니스 로직 구현:
- 비즈니스 로직이 복잡할 때, 트리거를 사용하여 데이터베이스 수준에서 로직을 구현할 수 있습니다. 이는 애플리케이션 레벨에서 로직을 구현하는 것보다 성능과 유지보수 측면에서 유리할 수 있습니다.
- 로그 및 감사 기능:
- 트리거를 사용하여 데이터 변경 이력을 기록하고, 감사 로그를 자동으로 생성할 수 있습니다. 이는 보안과 규정 준수 측면에서 중요한 역할을 합니다.
- 제약조건의 보완:
- 데이터베이스의 제약조건(CONSTRAINTS)으로 처리하기 어려운 복잡한 조건이나 제약사항을 트리거를 통해 추가할 수 있습니다. 예를 들어, 특정 조건이 충족될 때만 데이터 변경을 허용하는 제약을 구현할 수 있습니다.
- 서브 시스템 연동:
- 데이터베이스 내에서 다른 시스템이나 프로세스와의 연동이 필요할 때 트리거를 사용할 수 있습니다. 예를 들어, 외부 시스템에 데이터를 전송하거나, 다른 데이터베이스와 동기화 작업을 자동으로 수행할 수 있습니다.
- 성능 최적화:
- 트리거를 사용하여 반복적으로 수행되는 작업을 자동화함으로써 성능을 최적화할 수 있습니다. 데이터가 변경될 때마다 특정 작업을 자동으로 실행하게 하여 수동 작업을 줄이고 성능을 향상시킬 수 있습니다.
- 데이터 일관성 유지:
- 데이터베이스에서 일관성 있는 데이터 상태를 유지하기 위해 트리거를 사용할 수 있습니다. 예를 들어, 관련된 여러 테이블 간의 데이터 일관성을 보장하는 데 도움이 됩니다.
2-1. 트리거의 구성 요소
트리거는 다음과 같은 요소로 구성됩니다:
- 이벤트(Event): 트리거가 실행되는 조건입니다. 예를 들어, INSERT, UPDATE, DELETE와 같은 데이터 조작 이벤트가 있습니다.
- 조건(Condition): 트리거가 실행되기 위한 추가적인 조건입니다.
- 행 동작(Row level): 트리거가 각 행에 대해 실행되는지, 전체 문장에 대해 한 번만 실행되는지 여부를 정의합니다.
- 트리거 본문(Trigger body): 트리거가 실행되었을 때 수행할 작업입니다.
- 바인드 변수(Bind Variables) : 트리거가 실행되었을 때 참조되는 값들을 나타냅니다.
2-2. 바인드 변수의 의미
:NEW와 :OLD는 오라클 트리거에서 사용되는 특수한 바인드 변수입니다. 이 변수들은 트리거가 실행될 때 참조되는 값들을 나타내며, 각각의 의미는 다음과 같습니다:
- :NEW: 트리거가 실행될 때 삽입되거나 수정되는 새로운 값을 나타냅니다.
- :OLD: 트리거가 실행될 때 기존의 값을 나타냅니다.
트리거에서 :NEW와 :OLD의 사용 예
- INSERT 트리거:
- :NEW: 삽입될 새로운 값을 참조합니다.
- :OLD: 사용되지 않습니다 (INSERT 트리거에서 기존 값이 없기 때문).
- UPDATE 트리거:
- :NEW: 업데이트된 후의 새로운 값을 참조합니다.
- :OLD: 업데이트되기 전의 기존 값을 참조합니다.
- DELETE 트리거:
- :NEW: 사용되지 않습니다 (DELETE 트리거에서 새로운 값이 없기 때문).
- :OLD: 삭제되기 전의 기존 값을 참조합니다.
3. 트리거 생성 문법
오라클에서 트리거를 생성하는 기본 문법은 다음과 같습니다:
CREATE [OR REPLACE] TRIGGER trigger_name -- 트리거 이름
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
[OF column_name]
ON table_name -- 트리거가 작동되는 테이블
[REFERENCING OLD AS old_name NEW AS new_name] -- 기본 접두사에 대한 사용자 정의 이름을 지정할 수 있도록 해주는 기능
[FOR EACH ROW] -- 각 행마다 적용됨
[WHEN (condition)] -- 특정 조건이 만족될 때만 실행되도록 제어하는데 사용
BEGIN
-- 트리거 본문 [여기에 트리거 실행 시 수행할 동작을 작성]
IF -- IF조건문 [생략 가능]
:OLD.employee_id != :NEW.employee_id
TEHN
INSERT INTO audit_log (
operation,
old_id,
new_id
) VALUES(
'UPDATE',
:OLD.employee_id,
:NEW.employee_id
);
END IF;
END;
[REFERENCING OLD AS old_name NEW AS new_name] 구문 :
기본 접두사에 대한 사용자 정의 이름을 지정할 수 있도록 해주는 기능입니다. 이 구문을 사용하면, 트리거 코드에서 :OLD와 :NEW 대신 명확한 사용자 정의 이름을 사용할 수 있습니다.
3-1. 트리거 생성 예제 : AFTER INSERT
다음은 특정 테이블에 레코드가 삽입될 때마다 실행되는 트리거의 예입니다.
employees 테이블에 레코드가 삽입될 때마다 employees_backup 테이블에 해당 레코드를 삽입하는 트리거를 생성합니다.
CREATE OR REPLACE TRIGGER backup_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO employees_backup (
employee_id,
name,
position,
salary,
hire_date,
backup_date
) VALUES (
:NEW.employee_id,
:NEW.name,
:NEW.position,
:NEW.salary,
:NEW.hire_date,
SYSDATE
);
END;
- AFTER INSERT는 employees 테이블에 레코드가 삽입된 후에 트리거가 실행됨을 의미합니다.
3-2. 트리거 생성 예제 : BEFORE INSERT
다음은 특정 테이블에 레코드가 삽입되기 전에 백업 테이블에 해당 레코드를 삽입하는 트리거의 예입니다. employees 테이블에 레코드가 삽입되기 전에 employees_backup 테이블에 해당 레코드를 삽입하는 트리거를 생성합니다.
CREATE OR REPLACE TRIGGER backup_employee_before_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO employees_backup (
employee_id,
name,
position,
salary,
hire_date,
backup_date
) VALUES (
:NEW.employee_id,
:NEW.name,
:NEW.position,
:NEW.salary,
:NEW.hire_date,
SYSDATE
);
END;
- BEFORE INSERT는 employees 테이블에 레코드가 삽입되기 전에 트리거가 실행됨을 의미합니다.
3-3. 트리거 생성 예제 : BEFORE DELETE
다음은 employees 테이블에서 레코드가 삭제될 때, 삭제된 레코드를 employees_backup 테이블에 저장하는 트리거의 예입니다.
CREATE OR REPLACE TRIGGER backup_employee_before_delete
BEFORE DELETE ON employees
FOR EACH ROW
BEGIN
INSERT INTO employees_backup (
employee_id,
name,
position,
salary,
hire_date,
backup_date
) VALUES (
:OLD.employee_id,
:OLD.name,
:OLD.position,
:OLD.salary,
:OLD.hire_date,
SYSDATE
);
END;
3-4. 트리거 생성 예제 : BEFORE UPDATE
다음은 employees 테이블의 레코드가 업데이트되기 전에 기존 레코드를 employees_backup 테이블에 저장하는 BEFORE UPDATE 트리거를 생성합니다.
CREATE OR REPLACE TRIGGER backup_employee_before_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO employees_backup (
employee_id,
name,
position,
salary,
hire_date,
backup_date
) VALUES (
:OLD.employee_id,
:OLD.name,
:OLD.position,
:OLD.salary,
:OLD.hire_date,
SYSDATE
);
END;
'SQL > Oracle SQL' 카테고리의 다른 글
[oracle] 인덱스 힌트(Index Hint) (4) | 2024.08.07 |
---|---|
[oracle] EXPLAIN PLAN을 활용한 쿼리 성능 최적화 기법 (4) | 2024.08.07 |
[sql] LISTAGG 함수 (0) | 2024.07.18 |
[sql] 각 컬럼의 데이터를 합산한 쿼리 (0) | 2024.06.20 |
[oracle] DBMS_LOB 데이터 타입 및 함수 (0) | 2024.01.11 |