에듀테크 프로젝트 대시보드
함수와 트리거
DB 안에 로직을 둡니다. 무결성 보조·감사 로그·updated_at 자동화에 유용하지만, 비즈니스 로직을 통째로 넣는 건 신중히.
CREATE FUNCTION full_name(first text, last text)
RETURNS text
LANGUAGE sql IMMUTABLE
RETURN last || first;
SELECT full_name('한양', '김'); -- 김한양| 변동성 | 의미 (플래너 최적화에 영향) |
|---|---|
IMMUTABLE | 같은 입력 → 항상 같은 출력 (인덱스 표현식 가능) |
STABLE | 한 문장 안에서는 일정 (예: now()) |
VOLATILE (기본) | 매번 다를 수 있음 (random()) |
CREATE FUNCTION grade_letter(score int)
RETURNS text
LANGUAGE plpgsql IMMUTABLE
AS $$
BEGIN
IF score >= 90 THEN RETURN 'A';
ELSIF score >= 80 THEN RETURN 'B';
ELSE RETURN 'F';
END IF;
END;
$$;CREATE FUNCTION touch_updated_at()
RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
NEW.updated_at := now();
RETURN NEW;
END;
$$;
CREATE TRIGGER trg_touch
BEFORE UPDATE ON students
FOR EACH ROW EXECUTE FUNCTION touch_updated_at();BEFORE 트리거는 NEW 를 수정할 수 있고, AFTER 는 감사 로그처럼 다른 테이블에 쓸 때 씁니다. OLD 는 이전 값.
CREATE PROCEDURE archive_old_logs()
LANGUAGE plpgsql AS $$
BEGIN
INSERT INTO logs_archive SELECT * FROM logs WHERE created_at < now() - interval '90 days';
DELETE FROM logs WHERE created_at < now() - interval '90 days';
COMMIT; -- 함수와 달리 프로시저는 트랜잭션 제어 가능
END;
$$;
CALL archive_old_logs();