한양과학기술고등학교

에듀테크 프로젝트 대시보드

함수와 트리거

PL/pgSQL IMMUTABLE RETURNS TABLE TRIGGER NEW/OLD

DB 안에 로직을 둡니다. 무결성 보조·감사 로그·updated_at 자동화에 유용하지만, 비즈니스 로직을 통째로 넣는 건 신중히.

1. SQL 함수

CREATE FUNCTION full_name(first text, last text)
RETURNS text
LANGUAGE sql IMMUTABLE
RETURN last || first;

SELECT full_name('한양', '김');   -- 김한양
변동성의미 (플래너 최적화에 영향)
IMMUTABLE같은 입력 → 항상 같은 출력 (인덱스 표현식 가능)
STABLE한 문장 안에서는 일정 (예: now())
VOLATILE (기본)매번 다를 수 있음 (random())

2. PL/pgSQL

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;
$$;

3. updated_at 트리거

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 는 이전 값.

4. 프로시저

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();
"트랜잭션은 짧게, 잠금은 더 짧게"