ALTER COLLATION#
ALTER COLLATION
ALTER COLLATION — изменить определение правила сортировки
Синтаксис
ALTER COLLATIONname
REFRESH VERSION ALTER COLLATIONname
RENAME TOnew_name
ALTER COLLATIONname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONname
SET SCHEMAnew_schema
Описание
ALTER COLLATION
изменяет определение правила сортировки.
Вы должны владеть сопоставлением для использования ALTER COLLATION
.
Чтобы изменить владельца, вы должны иметь возможность SET ROLE
на
новую роль владельца, и эта роль должна иметь привилегию 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
.