IT Log
CREAETE TRIGGER 본문
728x90
반응형
개요
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FROM referenced_table_name ]
[ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE PROCEDURE function_name ( arguments )
where event can be one of:
INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE
정리 (표)
언제 | 이벤트 | 행 수준 | 상태 수준 |
BEFORE | INSERT/UPDATE/DELETE | Table, 외부 Table | Table, 외부 Table |
TRUNCATE | Table | ||
AFTER | INSERT/UPDATE/DELETE | Table, 외부 Table | Table, 외부 Table |
TRUNCATE | Table | ||
INSTEAD OF | INSERT/UPDATE/DELETE | View | |
TRUNCATE |
Parameter
BEFORE / AFTER / INSTEAD OF
- 이벤트 이전(BEFORE), 이후(AFTER) 또는 대신(INSTEAD OF) 호출되는지.
- 제약 Trigger는 AFTER로만 지정.
EVENT
- INSERT, UPDATE, DELETE, TRUNCATE 중 하나 지정.
- OR를 사용하여 여러개 지정 가능.
FOR EACH ROW / FOR EACH STATEMENT
- 모든 행에 대해 Trigger Procedure를 한 번 실행 (FOR EACH ROW).
- SQL문당 Trigger Procedure를 한 번 실행 (FOR EACH STATEMENT).
- 지정하지 않으면 FOR EACH STATEMENT가 기본값.
- 제약 조건 Trigger는 FOR EACH ROW만 가능.
CONDITION
- Trigger Function이 실행되는지 여부.
- 지정하면 조건이 True인 경우에만 Function을 호출.
- FOR EACH ROW인 경우 OLD를 작성하여, 이전 / 이후 값의 열을 참조.
- 당연히, INSERT는 OLD를, DELETE는 NEW를 참조할 수 없음.
- INSEAD OF는 지원하지 않음.
WHEN 예시
-- balance값이 변경된 경우에만 함수 실행
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
EXECUTE PROCEDURE check_account_update();
-- 어떤 열이라도 변경된 경우 함수 실행
CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_account_update();
728x90
반응형
'SQL > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] CREATE TABLE AS (0) | 2021.05.14 |
---|---|
[PostgreSQL] CREATE (0) | 2021.05.14 |
Trigger Procedures (0) | 2021.02.04 |
DROP (0) | 2019.12.11 |
Comments