English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PostgreSQL 트리거

PostgreSQL 트리거는 데이터베이스의 콜백 함수로, 지정된 데이터베이스 이벤트가 발생할 때 자동으로 실행됩니다/호출.

PostgreSQL 트리거에 대해 중요한 몇 가지 점은 다음과 같습니다:

  • PostgreSQL 트리거는 다음과 같은 경우에 트리거됩니다:

    • 작업이 실행되기 전(제약을 확인하고 삽입, 업데이트 또는 제거를 시도하기 전).

    • 작업이 실행된 후(제약을 확인하고 삽입, 업데이트 또는 제거가 완료된 후).

    • 뷰에 삽입, 업데이트, 제거를 수행할 때의 업데이트 작업입니다.

  • 트리거의 FOR EACH ROW 속성은 선택 사항입니다. 선택하면 행이 수정될 때마다 각 행을 호출합니다. 반대로 FOR EACH STATEMENT를 선택하면 수정된 행의 수에 관계없이 각 문에서 트리거가 한 번 실행됩니다.

  • WHEN 절과 트리거 작업이 NEW.column에 참조됩니다-name과 OLD.column-name은 테이블의 행 요소에 접근할 수 있습니다. column-name은 트리거와 연관된 테이블의 열 이름입니다.

  • WHEN 절이 존재하면 PostgreSQL 문은 WHEN 절이 성립하는 행만 실행합니다. WHEN 절이 없으면 PostgreSQL 문은 각 행에서 실행됩니다.

  • BEFORE 또는 AFTER 키워드는 트리거 액션을 언제 실행할지 결정합니다. 이는 관련 행이 삽입, 수정 또는 제거되기 전 또는 후에 실행되는지 결정합니다.

  • 수정할 테이블은 동일한 데이터베이스에 있어야 하며, 트리거가 추가된 테이블이나 뷰로서 tablename만 사용해야 합니다.

  • 제약 조건 트리거를 생성할 때 제약 옵션을 지정합니다. 이는 일반 트리거와 동일하지만, 이 제약을 사용하여 트리거가 트리거되는 시간을 조정할 수 있습니다. 제약 조건 트리거가 구현한 제약이 위반되면 예외가 발생합니다.

문법

트리거를 생성할 때의 기본 문법은 다음과 같습니다:

CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- 트리거 로직....
];

여기서 event_name은 언급된 테이블 table_name에서 INSERT, DELETE, UPDATE 데이터베이스 작업일 수 있습니다. 테이블 이름 뒤에 FOR EACH ROW를 지정할 수 있습니다:

다음은 테이블의 하나나 여러 개의 지정된 열에 UPDATE 작업에서 트리거를 생성하는 문법입니다:

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- 트리거 로직....
];

온라인 예제

우리는 새로 생성된 COMPANY 테이블에 (존재하면 지우고 다시 생성) 추가된 각 기록에 감사 시험을 유지하려는 상황을 가정해 보겠습니다:

w3codeboxdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

audit 테스트를 유지하기 위해 AUDIT라는 새로운 테이블을 생성하겠습니다. COMPANY 테이블에 새로운 기록이 추가될 때마다 로그 메시지가 해당 테이블에 삽입됩니다:

w3codeboxdb=# CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

여기서 ID는 AUDIT 기록의 ID이며, EMP_ID는 COMPANY 테이블에서来的 ID입니다. DATE는 COMPANY에서 기록이 생성된 시간 티켓을 유지합니다. 따라서, COMPANY 테이블에 대해 다음과 같이 트리거를 생성해 보겠습니다:

w3codeboxdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

auditlogfunc()는 PostgreSQL의 프로그램입니다. 정의는 다음과 같습니다:

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
   BEGIN
      INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$example_table$ LANGUAGE plpgsql;

지금부터 COMPANY 테이블에 데이터를 삽입하기 시작합니다:

w3codeboxdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );

이 때, COMPANY 테이블에 레코드가 삽입되었습니다:

AUDIT 테이블에도 레코드가 삽입되었습니다. COMPANY 테이블에 삽입할 때 trigger를 생성했기 때문입니다. 유사하게, 필요에 따라 업데이트 및 삭제 시 trigger를 생성할 수 있습니다:

emp_id | entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)

trigger 나열

당신은 pg_trigger 테이블에서 현재 데이터베이스의 모든 trigger를 나열할 수 있습니다:

w3codeboxdb=# SELECT * FROM pg_trigger;

특정 테이블의 trigger를 나열하려면 문법은 다음과 같습니다:

w3codeboxdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

결과를 얻습니다如下:

 tgname
-----------------
 example_trigger
(1 row)

trigger를 삭제하십시오

trigger를 삭제하는 기본 문법은 다음과 같습니다:

drop trigger ${trigger_name} on ${table_of_trigger_dependent};

本文의 테이블 company에서 trigger example_trigger를 삭제하는 명령어는 다음과 같습니다:

drop trigger example_trigger on company;