[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 값들이 잘 나오는지 확인하기 위해서 디버깅용으로 사용했던 것들, % 갯수만큼 뒤에 출력할 변수들을 덧붙여 주면된다.