Postgresql Trigger
트리거는 상태가 변하는 이벤트가 발생할 때 특정한 무언가를 수행하는 것이다.
원래 뜻을 보면 방아쇠인데 당기면 총알이 날아가듯 뭔가를 유발시키는 매개체 역할을 한다.
DB에서 언제 쓸까?
데이터베이스에서 어떤 조건에 의해서(WHEN) 실행하기 전(BEFORE)이나, 완료된 후(AFTER) 자동으로 지정한 함수(FUNCTION)를 실행하도록 지정할 수 있다.
사용 순서
- 자동 수행되어야 하는 함수를 미리 정의해야 한다. (인자는 없고 리턴 자료형은 trigger임)
- 트리거 기능을 추가하여 함수를 연결한다. 로우 단위 또는 명령 단위로 수행할 수 있다.
- 실행 순서에 따라 선처리(BEFORE), 후처리(AFTER)로 구분한다. 선처리의 경우 데이터가 중간에 변경될 수 있으므로 중의해야 한다.
- 트리거가 다중으로 있을 경우 트리거의 이름순으로 실행된다.
주의 사항
- 트리거가 또 다른 트리거를 발생시킬 수 있다. 이것은 프로그래머의 재량이다. 조심해야 한다.
예제 실습
- 테이블 만들기
- 트리거 함수 만들기
- 트리거 만들기
테이블 만들기
- 테이블 2개 만들거다.
- 첫번째 : emp 사원 넣는 거다.
CREATE TABLE emp ( empname text NOT NULL, salary integer );
- 두번째 : emp 사원 넣는거 확인해서 로그 남길거다.
CREATE TABLE emp_audit( operation char(1) NOT NULL, stamp timestamp NOT NULL, userid text NOT NULL, empname text NOT NULL, salary integer );
트리거 함수 만들기
- 트리거 함수 만들기
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$ BEGIN -- -- Create a row in emp_audit to reflect the operation performed on emp, -- make use of the special variable TG_OP to work out the operation. -- IF (TG_OP = 'DELETE') THEN INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*; RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*; RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*; RETURN NEW; END IF; RETURN NULL; -- result is ignored since this is an AFTER trigger END; $emp_audit$ LANGUAGE plpgsql;
트리거 만들기
- 트리거 생성
CREATE TRIGGER emp_audit AFTER INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
테스트
- emp 테이블에 INSERT랑 UPDATE랑 DELETE 하면서 테이블 관찰해 보자.
잘 된다. 막 만들면 postgresql에서는 public에다가 만드니깐 스키마 지정해서 하는게 더 나을듯…