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
.