database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9753 게시물 읽기
No. 9753
pg에서 after트리거 문의
작성자
지현명(gwise)
작성일
2017-01-16 06:39
조회수
8,504

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라고해도 상관 없습니다. 그러나 이러한 종류의 트리거에서도 오류를 발생시킴으로써 전체 작업을 중단시킬 수 있습니다.

 

혹시 메뉴얼의 이 문장하고 관련 있을까요?

 

 

 

 

 

 

이 글에 대한 댓글이 총 2건 있습니다.

return old 하면 다음 트리거가 받고, return null 하면 다음 트리거에서 받을게 없어지겠죠.

하나의 테이블에 여러개의 after 트리거도 있을 수 있으니까요.

 

김상기(ioseph)님이 2017-01-16 12:51에 작성한 댓글입니다.

트리거가 1개 이상일 경우를 생각 못했네요. 감사합니다.

그동안 개발하면서 테이블 하나에 트리거 1개 이상 사용해 본적이 없는거 같습니다.

지현명(gwise)님이 2017-01-16 13:00에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9757pg_repack install 관련 [3]
김은경
2017-01-16
9866
9756cpu사용량 로깅 [1]
ND
2017-01-16
9302
9754FDW 생성 테이블 접근 권한 확인은 어떻게 하나요? [3]
김은경
2017-01-16
8555
9753pg에서 after트리거 문의 [2]
지현명
2017-01-16
8504
9752dblink? 방법론 [1]
사랑
2017-01-11
9442
9751pgpool watchdog을 통한 vip 설정 방법 질문이요! [3]
Dean
2017-01-11
11350
9750Slony-I Replication 참고자료 [1]
사랑
2017-01-10
8179
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다