[Postgresql] 트리거 생성 및 확인하기

트리거를 사용한 게시판 프로젝트에서의 기능(트리거 사용 이유)


1. 게시판의 글을 유저들이 좋아요, 싫어요를 누를 수 있다.

2. 유저들은 하나의 게시글에 하나의 좋아요, 싫어요만 표현할 수 있다. ( Toggle 기능처럼 표현 )

3. 그렇게 하기 위해 Hate,Likey(like가 예약어라 likey로 하였음) 테이블을 각각 생성하였다.


1
2
3
4
5
6
7
8
9
10
11
--싫어요
create table tblHate(
    userSeq serial references tbluserinfo(userSeq),
    boardSeq serial references tblboard(boardSeq)
);
 --좋아요
 create table tblLikey(
    userSeq serial references tbluserinfo(userSeq),
    boardSeq serial references tblboard(boardSeq)
 );
 
cs


데이터 타입 serial은 잘못선언한것 같은데 bigint 정도로 해도 될것같다.


어떤 유저가 어떤 게시글에 좋아요 혹은 싫어요를 했는지 확인할 수 있는 테이블..


4. 저 테이블에 trigger를 걸것이다. 들어오는 board 키 값에 해당하는 게시글의 좋아요, 싫어요를 count하여 hate 컬럼을 update할것이다.


5. 트리거.( hate나 likey나 방식이 같기 때문에 hate로만 설명합니다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--Hate 싫어요 트리거 함수 생성
create or replace function hate_count() returns trigger as $trigger_hate_count$
    declare
    count bigint;
    begin
        if(TG_OP = 'INSERT') then
         select count(*into count from tblHate where boardSeq = new.boardSeq;
         update tblBoard set hate = count where boardSeq = new.boardSeq;
raise notice 'this is %',count; raise notice 'this is %',new.boardSeq;
         return new;
        elsif(TG_OP = 'DELETE') then
         select count(*into count from tblHate where boardSeq = old.boardSeq;
         update tblBoard set hate = count where boardSeq = old.boardSeq;
raise notice 'this is %',count;
  raise notice 'this is %',old.boardSeq;
         return old;
     end if;
    return null;
    end;
$trigger_hate_count$ language plpgsql;
 
--Hate 싫어요 트리거 생성
create trigger trigger_hate_count
after insert or update or delete on tblHate
 for each row execute procedure hate_count();
cs


- create or replace : 오브젝트를 생성하거나 수정하겠다는 의미. 처음생성할땐 create명령어가 먹고 drop 하지 않는 한 replace가 그다음부터는 실행될것이다. 따라서 대부분 오브젝트를 생성할때 생성하거나 수정한다~ 라는 키워드로 같이 쓰는편.


- function hate_count() returns trigger as $trigger_hate_count$ : 함수 hate_count()를 생성할건데 이 함수는 트리거를 반환한다. 그 트리거이름을 $$ 사이에 넣어준다.


- declare :  사용할 변수선언하는 곳, 여기서는 count값이 필요해서 선언해두었다.


- begin ~ end : 몸통부분, 표현하고자 하는 일련의 과정을 적는 곳.


- TG_OP : 발생하는 트리거 이벤트 종류, INSERT, DELETE, UPDATE, TRUNCATE가 있다고 한다. 본인은 INSERT와 DELETE가 필요하기 떄문에 두개만 해당.


- new. / old. : insert나 delete  update 이벤트를 발생시킬때 사용하는 접근변수? 라고한다. insert/update 이벤트의 경우 new 키워드로 새로 들어오는 값에 접근할 수 있고, delete / update 이벤트의 경우는 old 키워드로 제거/수정되고 난후의 값에 접근할 수 있다. 접근할 수 있는 값은 트리거가 바라보고 있는 테이블에 한해서 가능하다.


- into : select 문을 이용해서 어떤 단일값을 변수 count에 담을때 저러한 문법으로 담아야 한다.


- for each row : 각각의 row에 접근할 수 있다. 이걸 해야 .new / .old 키워드로 삽입/삭제/수정되는 값들에 접근할 수 있다.


- raise notice '문자열 %',변수 : 일반 출력문으로 count값과 old / new 값들이 잘 나오는지 확인하기 위해서 디버깅용으로 사용했던 것들, % 갯수만큼 뒤에 출력할 변수들을 덧붙여 주면된다.

댓글

Designed by JB FACTORY