커스텀 배지 쿼리를 작성하고 있었습니다. 이미 하나를 성공적으로 만들어 저장한 적이 있습니다. 아래 쿼리는 오류 없이 정상적으로 작동했습니다:
SELECT user_id, 0 post_id, current_timestamp granted_at
FROM badge_posts
WHERE (:backfill OR user_id IN (:user_ids) OR 0 NOT IN (:post_ids) )
GROUP BY user_id
HAVING count(*) > 499
이 쿼리는 다음에서 가져왔습니다: Some common badge queries
이 배지에 선택한 트리거는 “When a user edits or creates a post”(사용자가 게시물을 편집하거나 생성할 때) 대신 “After a post is processed”(게시물이 처리된 후)였습니다. 트리거를 후자로 변경하면 오류가 발생합니다.
서로 다른 트리거에 대해 더 많은 정보를 찾아보았는데, 찾을 수 있는 유일한 토픽은 여기입니다: Creating triggered custom badge queries
제 배지 쿼리 대부분은 특정 카테고리 내의 게시물 수, 답글 수 또는 주제 생성에 의존합니다.
이 3가지 트리거의 차이점과 쿼리에 따라 어떤 것을 선택해야 하는지 이해하려고 합니다.
- After a post is processed (게시물이 처리된 후)
- When a user acts on a post (사용자가 게시물에 작업을 수행할 때)
- When a user edits or creates a post (사용자가 게시물을 편집하거나 생성할 때)
왜 #3을 트리거로 선택하면 오류가 발생하지만 #1을 선택하면 오류가 발생하지 않는 것일까요?
다음 쿼리를 사용하여 다른 배지 쿼리를 만들어 보았습니다:
SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
SELECT id FROM categories WHERE name ilike 'foo'
) AND p.post_number = 1
GROUP BY p.user_id
여기서 'foo’는 제 카테고리의 슬러그(slug)입니다. 이번에는 트리거를 비워 두거나 “Update daily”(매일 업데이트)를 선택하면 오류 없이 저장됩니다. 그러나 트리거를 위의 1~3 중 어느 것으로 변경하든 오류가 발생합니다.
이는 SQL 쿼리에 :post_ids를 기반으로 트리거를 발생시키는 방법에 대한 정보가 누락되어 있기 때문이라고 생각합니다. 제 추측이 맞다면, 매일 실행되는 것이 아니라 ‘foo’ 카테고리의 모든 게시물에서 트리거가 발생하도록 위의 쿼리를 어떻게 수정해야 할까요?
설명이나 트리거에 대해 더 자세히 읽을 수 있는 참고 자료를 알려주시면 감사하겠습니다.