트리거(TRIGGER)란?
trigger는 데이터베이스가 미리 정해놓은 조건을 만족하거나 어떠한 동작이 수행되면 자동적으로 수행되는 행동.
테이블이나 뷰가 INSERT, UPDATE, DELETE등의 DML문에 의해 자동으로 실행되도록 할 수 있다.
이제 트리거를 생성법에 대해서 알아보자!
0. 트리거 특수 변수 및 알아둘 기능
- create or replace : 오브젝트를 생성하거나 수정하겠다는 의미. 처음생성할땐 create명령어가 먹고 drop 하지 않는 한 replace가 그다음부터는 실행될것이다. 따라서 대부분 오브젝트를 생성할때 생성하거나 수정한다~ 라는 키워드로 같이 쓰는편.
- function test() returns trigger as $trigger_testt$ : 함수 test()를 생성할건데 이 함수는 트리거를 반환한다. 그 트리거이름을 $$ 사이에 넣어준다.
- declare : 사용할 변수선언하는 곳
- begin ~ end : 몸통부분, 표현하고자 하는 일련의 과정을 적는 곳.
- for each row : 반복하여 각각의 row에 접근. 이걸 해야 .new / .old 키워드로 삽입/삭제/수정되는 값들에 접근할 수 있다.
- raise notice '문자열 %',변수 : 일반 출력문으로 count값과 old / new 값들이 잘 나오는지 확인하기 위해서 디버깅용 사용?, % 갯수만큼 뒤에 출력할 변수들을 덧붙여 주면된다.
[ 특수 변수 ]
- NEW
행 수준 트리거의 INSERT / UPDATE 작업에 대한 새 데이터베이스 행을 보유하는 변수.
DELETE작업에 대해 null값.
접근할 수 있는 값은 트리거가 바라보고 있는 테이블에 한해서 가능
- OLD
행 수준 트리거의 UPDATE / DELETE 작업에 대한 이전 데이터베이스 행을 보유하는 변수 입니다.
INSERT작업에 대해 null값.
접근할 수 있는 값은 트리거가 바라보고 있는 테이블에 한해서 가능.
- TG_NAME
데이터 유형 name; 실제로 발생한 트리거의 이름을 포함하는 변수.
- TG_WHEN
데이터 유형 text; 트리거의 정의에 따라 BEFORE, AFTER, INSTEAD OF의 문자열 .
- TG_LEVEL
데이터 유형 text; 트리거의 정의에 따라 ROW, STATEMENT의 문자열 .
- TG_OP
데이터 유형 text; INSERT, UPDATE, DELETE, TRUNCATE트리거가 발생한 작업을 알려주는 문자열.
- TG_RELID
데이터 유형 oid; 트리거 호출을 일으킨 테이블의 개체 ID. - TG_RELNAME
데이터 유형 name; 트리거 호출을 유발한 테이블의 이름. 이것은 이제 더 이상 사용되지 않으며 향후 릴리스에서 사라질 수 있다. 대신 TG_TABLE_NAME사용 권고
- TG_TABLE_NAME
데이터 유형 name; 트리거 호출을 유발한 테이블의 이름.
- TG_TABLE_SCHEMA
데이터 유형 name; 트리거 호출을 유발한 테이블의 스키마 이름.
- TG_NARGS
데이터 유형 integer; CREATE TRIGGER명령문 에서 트리거 함수에 제공된 인수의 수.
- TG_ARGV[]
의 데이터 유형 배열 text; CREATE TRIGGER문의 인수. 인덱스는 0부터 계산합니다. 잘못된 인덱스(0보다 작거나 크거나 같음 tg_nargs)는 null 값이 됩니다.
1. 테이블 생성
CREATE TABLE emp (
empname text PRIMARY KEY,
salary integer
);
--변경이력저장테이블
CREATE TABLE emp_audit (
operation char(1) NOT NULL,
last_date timestamp NOT NULL,
userid text NOT NULL,
empname text,
salary integer,
newEmpname text
);
2. 트리거 함수 생성
CREATE FUNCTION emp_trigger() RETURNS trigger AS $emp_trigger_test$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit VALUES('D',now(), user,OLD.*);
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit VALUES('U' now(), user, OLD.empname, new.salary, new.empname);
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit VALUES('I' now(), user, NEW.*);
-- emp테이블 등록시 emp_audit테이블에 변경이력 저장후 emp테이블에 등록한 내용 삭제하는 것
-- ELSIF (TG_OP = 'INSERT') THEN
-- INSERT INTO emp_audit VALUES('I' now(), user, NEW.*);
-- DELETE FROM emp where empname = new.empname;
END IF;
RETURN NULL;
END;
$emp_trigger_test$ LANGUAGE plpgsql;
3. 트리거 생성
CREATE TRIGGER emp_trigger_test
AFTER INSERT OR UPDATE OR DELETE ON emp_audit
FOR EACH ROW EXEUTE FUNCTION emp_trigger();
4. 확인
INSERT INTO emp values ('hong', 10);
--테이블 내용삭제
TRUNCATE TABLE emp;
TRUNCATE TABLE emp_audit;
[ 참고 사이트 ]
https://www.postgresql.org/docs/current/plpgsql-trigger.html
43.10. Trigger Functions
43.10. Trigger Functions 43.10.1. Triggers on Data Changes 43.10.2. Triggers on Events PL/pgSQL can be used to define trigger functions on …
www.postgresql.org
https://sas-study.tistory.com/182
[Postgresql] 트리거 생성 및 확인하기
트리거를 사용한 게시판 프로젝트에서의 기능(트리거 사용 이유) 1. 게시판의 글을 유저들이 좋아요, 싫어요를 누를 수 있다. 2. 유저들은 하나의 게시글에 하나의 좋아요, 싫어요만 표현할 수 있
sas-study.tistory.com
'DB > Postgresql' 카테고리의 다른 글
[postgresql] 문자열 길이 구하기 (1) | 2022.06.29 |
---|---|
[postgresql] sequence(시퀀스) 생성, 삭제, 활용 및 초기화 방법 (1) | 2022.06.28 |
[PostgreSQL] PostgreSQL 설치 방법 및 윈도우 cmd에서 psql 설정하는 법 (1) | 2022.06.11 |
[ Postgresql ] coalesce 함수 - null값 처리 (0) | 2022.05.10 |
[ PostgreSQL ] 문자열 합치기, 이어 붙이기 ( || , concat) (0) | 2022.04.21 |
댓글