ALTER COLLATION
ALTER COLLATION — изменить определение правила сортировки
Синтаксис
ALTER COLLATIONимя
REFRESH VERSION ALTER COLLATIONимя
RENAME TOновое_имя
ALTER COLLATIONимя
OWNER TO {новый_владелец
| CURRENT_USER | SESSION_USER } ALTER COLLATIONимя
SET SCHEMAновая_схема
Описание
ALTER COLLATION
изменяет определение правила сортировки.
Выполнить ALTER COLLATION
может только владелец соответствующего правила сортировки. Чтобы сменить владельца, необходимо быть непосредственным или опосредованным членом новой роли-владельца, а эта роль должна иметь право CREATE
в схеме правила сортировки. (С такими ограничениями при смене владельца не происходит ничего такого, что нельзя было бы сделать, имея право удалить и вновь создать правило сортировки. Однако суперпользователь может сменить владельца правила сортировки в любом случае.)
Параметры
имя
Имя существующего правила сортировки (возможно, дополненное схемой).
новое_имя
Новое имя правила сортировки.
новый_владелец
Новый владелец правила сортировки.
новая_схема
Новая схема правила сортировки.
REFRESH VERSION
Обновить версию правила сортировки. Подробности в разделе Замечания ниже.
Замечания
Когда применяются правила сортировки, предоставляемые библиотекой ICU, внутренняя версия сортировщика ICU записывается в системный каталог при создании объекта для данного правила. Когда такое правило используется, текущая версия сверяется с записанной и в случае несовпадения выдаётся предупреждение, например такое:
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 Postgres Pro with the right library version.
Изменения в определениях правил сортировки могут приводить к разрушению индексов и другим проблемам, так как СУБД рассчитывает на то, что хранимые объекты отсортированы в определённом порядке. Вообще этого следует избегать, но это может иметь место в совершенно легальных обстоятельствах, например при обновлении с помощью pg_upgrade
исполняемых файлов сервера, скомпонованных с более новой версией ICU. Когда возникает такая ситуация, все объекты, зависящие от данного правила сортировки, должны быть перестроены, например, командой REINDEX
. После этой операции можно обновить версию правила сортировки, выполнив команду ALTER COLLATION ... REFRESH VERSION
. При этом системный каталог будет обновлён, в него будет записана текущая версия сортировщика, и предупреждение уйдёт. Заметьте, что эта команда собственно не проверяет, были ли все зависимые объекты перестроены корректно.
Когда применяются правила сортировки, предоставляемые библиотекой libc
, и PostgreSQL собран с библиотекой GNU C, в качестве версии правила сортировки используется версия библиотеки C. Так как определения правил сортировки обычно меняются только с новыми версиями библиотеки, это даёт некоторую, хотя и не абсолютно надёжную, защиту от искажения данных в базе.
В настоящее время версия правила сортировки, установленного для базы по умолчанию, не отслеживается.
Следующий запрос позволяет выбрать все правила сортировки в текущей базе данных, которые требуют обновления, и зависящие от них объекты:
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;
Примеры
Изменение названия правила сортировки с ru_RU
на russian
:
ALTER COLLATION "ru_RU" RENAME TO russian;
Изменение владельца правила сортировки en_US
на joe
:
ALTER COLLATION "en_US" OWNER TO joe;
Совместимость
Оператор ALTER COLLATION
отсутствует в стандарте SQL.