IT Log

CREAETE TRIGGER 본문

SQL/PostgreSQL

CREAETE TRIGGER

newly0513 2021. 2. 5. 16:13
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();

 

 

 

참조 : www.postgresql.org/docs/9.6/sql-createtrigger.html

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