SET

SET (SET)

런타임 파라미터를 변경하는 명령이에요. Chapter 19에 나열된 런타임 파라미터 상당수를 SET으로 실행 중에 바꿀 수 있어요. SET은 현재 세션이 사용하는 값에만 영향을 줍니다.

출처: PostgreSQL 문서

본문

개요 (Synopsis)

SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }

설명 (Description)

SET 명령은 런타임 구성 파라미터를 변경해요. Chapter 19에 나열된 런타임 파라미터 상당수를 SET으로 on-the-fly로 바꿀 수 있어요. (일부 파라미터는 수퍼유저와 그 파라미터에 SET 권한을 부여받은 사용자만 바꿀 수 있어요. 또한 서버나 세션 시작 후에는 바꿀 수 없는 파라미터도 있어요.) SET은 현재 세션이 사용하는 값에만 영향을 줍니다.

이후 중단되는 트랜잭션 안에서 SET(또는 동등하게 SET SESSION)을 실행하면, SET 명령의 효과는 트랜잭션이 롤백될 때 사라져요. 주변 트랜잭션이 커밋되면 그 효과는 다른 SET으로 덮어쓰지 않는 한 세션이 끝날 때까지 지속됩니다.

SET LOCAL의 효과는 커밋되든 안 되든 현재 트랜잭션 끝까지만 지속돼요. 특별한 경우로, 단일 트랜잭션 안에서 SET 다음에 SET LOCAL이 오면: SET LOCAL 값은 트랜잭션 끝까지 보이지만, 그 후에는(트랜잭션이 커밋된다면) SET 값이 적용돼요.

SET 또는 SET LOCAL의 효과는 명령보다 앞선 세이브포인트로 롤백해도 취소돼요.

같은 변수에 대한 SET 옵션을 가진 함수(see CREATE FUNCTION) 안에서 SET LOCAL을 사용하면, SET LOCAL 명령의 효과는 함수 종료 시 사라져요. 즉 함수가 호출됐을 때 적용되던 값이 어차피 복원됩니다. 따라서 SET LOCAL은 함수 안에서 파라미터를 동적으로 또는 반복해서 바꾸는 데 쓰면서, 동시에 SET 옵션을 사용해 호출자의 값을 저장·복원하는 편의를 누릴 수 있어요. 다만 일반 SET 명령은 주변 함수의 SET 옵션을 덮어써요. 그 효과는 롤백되지 않는 한 지속됩니다.

Note: PostgreSQL 8.0부터 8.2 버전에서는 SET LOCAL의 효과가 더 앞선 세이브포인트를 해제하거나 PL/pgSQL 예외 블록에서 성공적으로 빠져나오면 취소됐어요. 이 동작은 직관적이지 않다고 판단되어 변경됐어요.

파라미터 (Parameters)

  • SESSION — 명령이 현재 세션에 적용되도록 지정해요. (SESSIONLOCAL도 없으면 기본값이에요.)
  • LOCAL — 명령이 현재 트랜잭션에만 적용되도록 지정해요. COMMIT이나 ROLLBACK 후에는 세션 레벨 설정이 다시 적용돼요. 트랜잭션 블록 밖에서 실행하면 경고가 나오고 그 외에는 아무 효과가 없어요.
  • configuration_parameter — 설정 가능한 런타임 파라미터의 이름이에요. 사용 가능한 파라미터는 Chapter 19와 아래에서 문서화돼 있어요.
  • value — 파라미터의 새 값이에요. 값은 특정 파라미터에 적합하게 문자열 상수, 식별자, 숫자, 또는 이것들의 쉼표 구분 목록으로 지정할 수 있어요. DEFAULT를 쓰면 파라미터를 기본값으로 리셋함을 지정할 수 있어요 (즉 현재 세션에서 SET을 실행하지 않았다면 가졌을 값).

Chapter 19에 문서화된 구성 파라미터 외에도, SET 명령으로만 조정할 수 있거나 특별한 구문을 가진 파라미터가 몇 개 있어요:

  • SCHEMASET SCHEMA 'value'SET search_path TO value의 별칭이에요. 이 구문으로는 하나의 스키마만 지정할 수 있어요.

  • NAMESSET NAMES 'value'SET client_encoding TO value의 별칭이에요.

  • SEED — 난수 생성기(random 함수)의 내부 시드를 설정해요. 허용되는 값은 -1과 1을 포함한 그 사이의 부동소수점 숫자예요. 시드는 setseed 함수를 호출해도 설정할 수 있어요:

    SELECT setseed(value);
    
  • TIME ZONESET TIME ZONE 'value'SET timezone TO 'value'의 별칭이에요. SET TIME ZONE 구문은 시간대 지정을 위한 특별한 구문을 허용해요. 유효한 값의 예시는 다음과 같아요:

    • 'America/Los_Angeles' — 캘리포니아 버클리의 시간대.
    • 'Europe/Rome' — 이탈리아의 시간대.
    • -7 — UTC에서 서쪽으로 7시간인 시간대(PDT와 동일). 양수 값은 UTC에서 동쪽을 의미해요.
    • INTERVAL '-08:00' HOUR TO MINUTE — UTC에서 서쪽으로 8시간인 시간대(PST와 동일).
    • LOCAL, DEFAULT — 로컬 시간대(즉 서버의 기본 timezone 값)로 설정.

숫자나 인터벌로 주어진 시간대 설정은 내부적으로 POSIX 시간대 구문으로 변환돼요. 예를 들어 SET TIME ZONE -7 후에 SHOW TIME ZONE<-07>+07을 보고할 거예요.

SET은 시간대 약어(time zone abbreviation)를 지원하지 않아요. 시간대에 대한 자세한 내용은 Section 8.5.3을 참고하세요.

참고 (Notes)

set_config 함수는 동등한 기능을 제공해요. Section 9.28.1을 참고하세요. 또한 pg_settings 시스템 뷰를 UPDATESET과 동등한 작업을 수행할 수도 있어요.

예시 (Examples)

스키마 검색 경로를 설정해요:

SET search_path TO my_schema, public;

날짜 스타일을 "day before month" 입력 규약을 가진 전통적인 POSTGRES 스타일로 설정해요:

SET datestyle TO postgres, dmy;

캘리포니아 버클리의 시간대를 설정해요:

SET TIME ZONE 'America/Los_Angeles';

이탈리아의 시간대를 설정해요:

SET TIME ZONE 'Europe/Rome';

호환성 (Compatibility)

SET TIME ZONE은 SQL 표준에 정의된 구문을 확장해요. 표준은 숫자 시간대 오프셋만 허용하지만 PostgreSQL은 더 유연한 시간대 지정을 허용해요. 그 외 모든 SET 기능은 PostgreSQL 확장 기능이에요.

더 알아보기 (Learn more)