250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

y.developer

[TIL] Day 83 Supabase에서 Trigger 및 Function 추가 (SQL) 본문

카테고리 없음

[TIL] Day 83 Supabase에서 Trigger 및 Function 추가 (SQL)

y.developer 2024. 2. 1. 03:33
728x90

2024.01.31 수

 

추가적인 정리 필요!

트러블슈팅 내용 보고 다시 정리하자

 

Trigger

트리거는 데이터베이스에서 특정 이벤트가 발생할 때 자동으로 실행되는 일련의 작업이나 프로그램이다.

해당 이벤트는 주로 데이터 조작 언어(DML) 문장들의 실행에 의해 발생하며, 예를 들면 INSERT, UPDATE, DELETE와 같은 작업이 해당된다.

트리거의 주요 목적은 데이터베이스의 무결성(integrity)을 유지하고 비즈니스 규칙을 강제하기 위함에 있다.

데이터 조작이 발생할 때마다 실행되므로, 특정 조건이나 규칙을 준수하도록 강제할 수 있다.

 

  1. 무결성 유지: 트리거를 사용하여 데이터베이스의 무결성 규칙을 강제하고 잘못된 데이터 조작을 방지합니다.
  2. 이력 추적: 데이터 변경에 대한 이력을 추적하기 위해 트리거를 사용할 수 있습니다. 예를 들어, 언제 어떤 데이터가 변경되었는지를 기록할 수 있습니다.
  3. 자동화된 작업: 특정 이벤트 발생 시 자동으로 특정 작업이 실행되도록 하는데 사용될 수 있습니다.

트리거는 여러 이벤트와 조건에 따라 작동할 수 있으며, 데이터베이스 시스템에 따라 구현 방법이 다를 수 있다.

종류에는 BEFORE 트리거와 AFTER 트리거 등이 있으며, 각각 데이터 조작 작업 이전과 이후에 실행된다.

 

 

Function

트리거에서 사용되는 함수는 주로 트리거가 실행될 때 특정 작업을 수행하기 위해 호출되는 사용자 정의 함수(UDF, User-Defined Function)를 의미한다.

해당 함수는 트리거의 본문에서 호출되어 원하는 동작을 수행하게 된다.

 

  1. 데이터 가공 및 계산: 함수를 사용하여 데이터베이스의 특정 값을 계산하거나 가공할 수 있습니다. 예를 들어, 트리거가 실행될 때 특정 필드의 값을 합산하거나 평균을 계산하는 등의 작업을 수행할 수 있습니다.
  2. 조건 검사 및 결정: 함수를 활용하여 특정 조건을 검사하고, 조건에 따라 트리거의 동작을 제어할 수 있습니다. 이를 통해 특정 상황에서만 트리거가 특정 동작을 수행하도록 할 수 있습니다.
  3. 외부 리소스와의 상호 작용: 함수를 사용하여 데이터베이스 외부의 리소스와 상호 작용할 수 있습니다. 예를 들어, 외부 API 호출이나 다른 데이터베이스와의 통합 등이 가능합니다.

트리거에서 사용되는 함수는 주로 데이터베이스 시스템에 따라 다르며, 각 데이터베이스 시스템의 문서나 지원하는 함수 목록을 확인하여 사용법을 이해하는 것이 중요하다.

함수의 사용은 트리거를 더 유연하게 제어하고 데이터베이스의 특정 요구 사항에 맞추기 위한 중요한 도구로 활용된다.

 

 

문제상황

채팅방이 열리는 조건에 알맞지 트리거가 관여하고 있음

 

기존 트리거에 문제가 생겼다.

임시적으로 생성해놓았던 트리거의 조건이 내가 의도한 동작과 다르게 작동한다.

 

현재 상황

채팅방 열리는 조건~~

 

개선해야할 상황

채팅방 열리는 조건~~

 

 

해결 방법

  • 플러팅메시지 테이블에 first_message_trigger 추가
  • 각종 타입 정리 및 수정사항 적용
  • 트리거 작동 방식 찾는중…
  • status, sender_is_read_in_noti, receiver_is_read_in_noti update 함수 수정…
  • 트리거 및 함수 삭제 후 새로 생성

 

 

트리거 수정할 때 작성한 SQL 코드

SQL 코드 생성할 때 생각해야할 정보

  • Functions
    • Name of function
    • Schema
    • Definition
  • Triggers
    • 테이블명
    • 원하는 트리거 조건들
    • 원하는 작동 결과
// 기존 트리거 및 함수 삭제
DROP TRIGGER IF EXISTS status_accept_to_add_public_message ON flirting_list;
DROP FUNCTION IF EXISTS handle_add_first_message();

 

// 새로운 함수 생성
CREATE OR REPLACE FUNCTION handle_add_first_message()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.status = 'ACCEPT' THEN
        INSERT INTO public.message(message, user_uid, subscribe_room_id)
        VALUES (NEW.flirting_message, NEW.sender_uid, (SELECT id FROM chat_room WHERE flirting_list_id = NEW.id));
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

// 새로운 트리거 생성
create trigger status_accept_to_add_public_message before
update on flirting_list for each row when (
  new.status = 'ACCEPT'::"STATUS Type"
  and new.first_message_trigger = true
)
execute function handle_add_first_message ();

 

// 테이블 SQL에 적용된 모습
create trigger status_accept_to_add_public_message before
update on flirting_list for each row when (
  new.status = 'ACCEPT'::"STATUS Type"
  and new.first_message_trigger = true
)
execute function handle_add_first_message ();

 

 

 

 

트리거 어디서 작동되는지 파악중

 

리거 및 함수 새로 적용 및 통신로직 함수 까지 변경 완료 / 테스트 완료 / 이제 받은청함에서 받은 사람이 수락만 누르면 트리거가 작동되어 첫 메시지가 보내지고 채팅방도 오픈됨

728x90