ALTER COLLATION — 콜레이션 정의 변경하기

ALTER COLLATION — 콜레이션 정의 변경하기

ALTER COLLATION은 이미 존재하는 콜레이션(collation, 정렬 규칙)의 정의를 바꾸는 명령이에요. 이름이나 소유자, 스키마를 바꾸거나 콜레이션 버전을 새로 고칠 때 써요. 특히 콜레이션 정의가 바뀌었을 때 경고를 없애려면 REFRESH VERSION을 사용하게 돼요.

출처: PostgreSQL 문서

본문

시놉시스 (Synopsis)

ALTER COLLATION name REFRESH VERSION

ALTER COLLATION name RENAME TO new_name
ALTER COLLATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER COLLATION name SET SCHEMA new_schema

설명 (Description)

ALTER COLLATION은 콜레이션의 정의를 변경해요. ALTER COLLATION을 쓰려면 콜레이션의 소유자여야 해요. 소유자를 바꾸려면 새 소유 역할로 SET ROLE할 수 있어야 하고 그 역할이 콜레이션의 스키마에 CREATE 권한을 가져야 해요. (이런 제약은 소유자를 바꾸는 게 콜레이션을 드롭하고 다시 만드는 것 이상의 일을 하지 못하게 막아 주는 거예요. 다만 슈퍼유저는 어떤 콜레이션이든 소유권을 바꿀 수 있어요.)

매개변수 (Parameters)

  • name — 기존 콜레이션의 이름(선택적으로 스키마 한정)이에요.
  • new_name — 콜레이션의 새 이름이에요.
  • new_owner — 콜레이션의 새 소유자예요.
  • new_schema — 콜레이션의 새 스키마예요.
  • REFRESH VERSION — 콜레이션의 버전을 갱신해요. 아래 참고(Notes)를 보세요.

참고 (Notes)

콜레이션 객체가 만들어질 때, 콜레이션의 provider별 버전이 시스템 카탈로그에 기록돼요. 콜레이션을 사용할 때 현재 버전을 기록된 버전과 비교하고, 불일치하면 예를 들어 다음과 같은 경고를 냅니다:

WARNING:  collation "xx-x-icu" has version mismatch
DETAIL:  The collation in the database was created using version 1.2.3.4, but the operating system provides version 2.3.4.5.
HINT:  Rebuild all objects affected by this collation and run ALTER COLLATION pg_catalog."xx-x-icu" REFRESH VERSION, or build PostgreSQL with the right library version.

콜레이션 정의가 바뀌면 저장된 객체가 특정 정렬 순서에 의존하기 때문에 인덱스가 손상되고 다른 문제가 생길 수 있어요. 보통은 피해야 하지만, 운영체제를 새 메이저 버전으로 업그레이드하거나 더 새로운 버전의 ICU에 링크된 서버 바이너리로 pg_upgrade할 때처럼 정당한 상황에서 일어날 수 있어요. 이럴 때는 콜레이션에 의존하는 모든 객체를 (예: REINDEX로) 다시 만들어야 해요. 다시 만든 다음에는 ALTER COLLATION ... REFRESH VERSION 명령으로 콜레이션 버전을 새로 고칠 수 있어요. 이 명령은 시스템 카탈로그를 갱신해 현재 콜레이션 버전을 기록하고 경고를 사라지게 해요. 단, 실제로 영향을 받은 객체가 올바르게 다시 만들어졌는지 확인하지는 않아요.

libc가 제공하는 콜레이션을 쓸 때 버전 정보는 GNU C 라이브러리(대부분의 리눅스), FreeBSD, Windows 시스템에서 기록돼요. ICU가 제공하는 콜레이션을 쓸 때는 버전 정보가 ICU 라이브러리에서 제공되며 모든 플랫폼에서 가능해요.

참고: GNU C 라이브러리를 콜레이션에 쓸 때는 C 라이브러리의 버전을 콜레이션 버전의 대리(proxy)로 사용해요. 많은 리눅스 배포판이 C 라이브러리를 업그레이드할 때만 콜레이션 정의를 바꾸지만, 유지보수자는 더 새로운 콜레이션 정의를 이전 C 라이브러리 릴리스로 백포트할 자유가 있으므로 이 방법은 완벽하지 않아요. Windows를 콜레이션에 쓸 때는 en-US 같은 BCP 47 언어 태그로 정의된 콜레이션에서만 버전 정보를 얻을 수 있어요.

데이터베이스 기본 콜레이션에는 비슷한 명령인 ALTER DATABASE ... REFRESH COLLATION VERSION이 있어요. 다음 쿼리로 현재 데이터베이스에서 새로 고쳐야 할 콜레이션과 그에 의존하는 객체를 모두 찾을 수 있어요:

SELECT pg_describe_object(refclassid, refobjid, refobjsubid) AS "Collation",
       pg_describe_object(classid, objid, objsubid) AS "Object"
  FROM pg_depend d JOIN pg_collation c
       ON refclassid = 'pg_collation'::regclass AND refobjid = c.oid
  WHERE c.collversion <> pg_collation_actual_version(c.oid)
  ORDER BY 1, 2;

예제 (Examples)

콜레이션 de_DEgerman으로 이름을 바꾸려면:

ALTER COLLATION "de_DE" RENAME TO german;

콜레이션 en_US의 소유자를 joe로 바꾸려면:

ALTER COLLATION "en_US" OWNER TO joe;

호환성 (Compatibility)

SQL 표준에는 ALTER COLLATION 문이 없어요.

더 알아보기 (Learn more)

  • CREATE COLLATION — 새 콜레이션을 만드는 명령이에요.
  • DROP COLLATION — 콜레이션을 삭제하는 명령이에요.
  • ALTER DATABASE — 데이터베이스 기본 콜레이션 버전을 새로 고칠 수 있어요.