ALTER COLLATION#

ALTER COLLATION

ALTER COLLATION

ALTER COLLATION — изменить определение правила сортировки

Синтаксис

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

Описание

ALTER COLLATION изменяет определение правила сортировки.

Вы должны быть владельцем правила сортировки, чтобы использовать ALTER COLLATION. Чтобы изменить владельца, вы также должны быть прямым или косвенным членом новой владеющей роли, и эта роль должна иметь привилегию CREATE на схему правила сортировки. (Эти ограничения обеспечивают, что изменение владельца не делает ничего, что вы не могли бы сделать, удалив и создав правило сортировки заново. Однако суперпользователь может изменить настройки владения любым правилом сортировки в любом случае).

Параметры

name

Имя (опционально с указанием схемы) существующего правила сортировки.

new_name

Новое имя правила сортировки.

new_owner

Новый владелец правила сортировки.

new_schema

Новая схема для правила сортировки.

REFRESH VERSION

Обновите версию правила сортировки. См. Notes ниже.

Примечания

При создании объекта правила сортировки, версия правила сортировки, связанная с провайдером, записывается в системный каталог. При использовании правила сортировки, текущая версия проверяется на соответствие записанной версии, и выводится предупреждение в случае несоответствия, например:

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.

Изменение определений правила сортировки может привести к повреждению индексов и другим проблемам, поскольку система базы данных полагается на то, что сохраненные объекты имеют определенный порядок сортировки. В целом, это следует избегать, но это может произойти в законных случаях, например, при обновлении операционной системы до новой основной версии или при использовании pg_upgrade для обновления серверных бинарных файлов, связанных с более новой версией ICU. Когда это происходит, все объекты, зависящие от правила сортировки, должны быть перестроены, например, с использованием REINDEX. После этого версия правила сортировки может быть обновлена с помощью команды ALTER COLLATION ... REFRESH VERSION. Это обновит системный каталог, чтобы записать текущую версию правила сортировки и устранить предупреждение. Обратите внимание, что это фактически не проверяет, были ли все затронутые объекты перестроены правильно.

Когда используются правила сортировки, предоставляемые библиотекой libc, информация о версии записывается на системах, использующих библиотеку GNU C (большинство систем Linux), FreeBSD и Windows. При использовании правил сортировки предоставляемых библиотекой ICU, информация о версии предоставляется библиотекой ICU и доступна на всех платформах.

Примечание

При использовании библиотеки GNU C для правил сортировки, версия библиотеки C используется в качестве прокси для версии правила сортировки. Многие дистрибутивы Linux изменяют определения правил сортировки только при обновлении библиотеки C, но такой подход несовершенен, поскольку разработчики имеют возможность обратно портировать новые определения правил сортировки в более старые версии библиотеки C.

При использовании Windows для сортировок информация о версии доступна только для сортировок, определенных с помощью языковых тегов BCP 47, таких как en-US.

Для правила сортировки по умолчанию базы данных существует аналогичная команда 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;

Примеры

Чтобы переименовать правило сортировки de_DE в german:

ALTER COLLATION "de_DE" RENAME TO german;

Чтобы изменить владельца правила сортировки en_US на joe:

ALTER COLLATION "en_US" OWNER TO joe;

Совместимость

В стандарте SQL нет оператора ALTER COLLATION.