https://www.postgresql.org/docs/9.6/static/plpgsql-trigger.html
안녕하세요. pg에 한창 공부중인 개발자입니다.
위에 공식 메뉴얼보다가 pg만의 트리거가 독특한 점이 있어서 문의 드립니다.
CREATE TABLE emp (
empname text NOT NULL,
salary integer
);
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();
---
이렇게 하고 테스트 하니 잘 되기는 하는데 궁금한 것이 after트리거 프로시저에서
맨 아래 "return null"은 이해가 되나 TG_OP에 따른 return old/return new는 어떤 기능을 하나요?
TG_OP에 return 3개를 전부 null로 해도 차이가 없는데 다른 의미가 있는지 궁금합니다.
after트리거 프로시저에서 맨아래 "return null"하나만 있어도 기능상에 차이가 없기도 하구요...
Before트리거 프로시저 기능으로 추정해 보면 다음으로 넘겨 주는거로 생각되는데 그렇다면 after트리거 프로시저에서는
맨 아래 "RETURN NULL; -- result is ignored since this is an AFTER trigger" 이거 하나만 있으면 되지 않나요?
"The return value of a row-level trigger fired AFTER or a statement-level trigger fired BEFORE or AFTER is always ignored; it might as well be null. However, any of these types of triggers might still abort the entire operation by raising an error."
행 수준 AFTER트리거 문장 레벨 BEFORE또는 AFTER트리거의 반환 값은 항상 무시됩니다. NULL라고해도 상관 없습니다. 그러나 이러한 종류의 트리거에서도 오류를 발생시킴으로써 전체 작업을 중단시킬 수 있습니다.
혹시 메뉴얼의 이 문장하고 관련 있을까요?
|