Перейти к основному содержимому

ALTER COLLATION

примечание

Эта страница переведена при помощи нейросети GigaChat.

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. Чтобы изменить владельца, необходимо иметь возможность задать 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.

Смотрите также

CREATE COLLATION, DROP COLLATION