ALTER COLLATION — 문자정렬규칙 정의 바꾸기
ALTER COLLATION이름
REFRESH VERSION ALTER COLLATION이름
RENAME TO새이름
ALTER COLLATION이름
OWNER TO {새소유주
| CURRENT_USER | SESSION_USER } ALTER COLLATION이름
SET SCHEMA새스키마
ALTER COLLATION
명령은 문자 정렬 규칙의 정의를 바꾼다.
작업 대상 정렬 규칙의 소유주여야 ALTER COLLATION
명령을
사용할 수 있다. 소유주를 바꾸는 경우에는
기존 소유주는 새 소유주의 직간접적으로 구성원이어야 하며,
새 소유주는 해당 스키마에 대해서 CREATE
권한이
있어야 한다. (새 소유주가 해당 정렬 규칙을 삭제 하거나,
새로 만들 수 있도록 하기 위함이다. 슈퍼유저는 이런 제약 없이
소유주를 변경 할 수 있다.)
이름
작업 대상 문자 정렬 규칙 이름(스키마 이름 포함).
새이름
바뀔 새 이름.
새소유주
바뀔 새 소유주 이름.
새스키마
바뀔 새 스키마 이름.
REFRESH VERSION
버전 갱신. 참고에서 자세히 설명함.
ICU 라이브러리에서 제공하는 문자 정렬 규칙을 사용하는 경우, 그 규칙이 처음 만들어질 때, ICU 고유 버전을 각 규칙 별로 시스템 카탈로그에 기록해 둔다. 그리고, 그 규칙을 사용할 때 그 규칙의 ICU 현재 버전과, 시스템 카탈로그에 기록된 버전을 비교하고, 다르면 다음과 같은 경고를 출력한다:
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
명령으로 갱신한다. 이렇게 해서 위와 같은 경고를
없앨 수 있다. 윗 경고는 문자 정렬 규칙의 버전이 다르다고 알려주는 것 뿐이지
관련 모든 개체들이 정상적으로 다시 만들어졌는지를 확인하지는 않음을
기억해야 한다.
When using collations provided by libc
and
PostgreSQL was built with the GNU C library, the
C library's version is used as a collation version. Since collation
definitions typically change only with GNU C library releases, this provides
some defense against corruption, but it is not completely reliable.
Currently, there is no version tracking for the database default collation.
아래 쿼리는 현재 데이터베이스에서 버전 재 갱신이 필요한 문자 정렬 규칙과 그것을 사용하는 개체들을 찾는데 사용할 수 있다:
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;
de_DE
정렬 규칙을 german
으로 이름 바꿈:
ALTER COLLATION "de_DE" RENAME TO german;
en_US
정렬 규칙의 소유주를
joe
사용자로 바꿈:
ALTER COLLATION "en_US" OWNER TO joe;
ALTER COLLATION
구문은 표준 SQL 구문이 아니다.