English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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)
당신은 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를 삭제하는 기본 문법은 다음과 같습니다:
drop trigger ${trigger_name} on ${table_of_trigger_dependent};
本文의 테이블 company에서 trigger example_trigger를 삭제하는 명령어는 다음과 같습니다:
drop trigger example_trigger on company;