ALTER COLLATION — изменение определения правила сортировки
ALTER COLLATIONnameREFRESH VERSION ALTER COLLATIONnameRENAME TOnew_nameALTER COLLATIONnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONnameSET SCHEMAnew_schema
ALTER COLLATION изменяет определение правила сортировки.
Чтобы выполнить команду ALTER COLLATION, вы должны быть владельцем правила сортировки.
Для изменения владельца вы должны иметь возможность выполнить SET ROLE для
новой владеющей роли, и эта роль должна иметь привилегию CREATE
в схеме правила сортировки.
(Эти ограничения гарантируют, что изменение владельца
не позволяет сделать ничего, чего нельзя было бы сделать удалением и повторным созданием
правила сортировки. Однако суперпользователь может изменить владельца любого правила сортировки
в любом случае.)
nameИмя (возможно, дополненное схемой) существующего правила сортировки.
new_nameНовое имя правила сортировки.
new_ownerНовый владелец правила сортировки.
new_schemaНовая схема для правила сортировки.
REFRESH VERSIONОбновить версию правила сортировки. См. Примечания ниже.
При создании объекта правила сортировки в системный каталог записывается специфичная для поставщика версия правила сортировки. При использовании правила сортировки текущая версия проверяется на соответствие записанной версии, и при несоответствии выдается предупреждение, например:
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.