ALTER COLLATION

ALTER COLLATION — изменить определение правила сортировки


Синтаксис

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 PostgreSQL with the right library version.
-- ПРЕДУПРЕЖДЕНИЕ: версия правила сортировки "xx-x-icu" не совпадает
-- ПОДРОБНОСТИ: Правило сортировки в базе данных было создано с помощью версии 1.2.3.4, а операционная система предоставляет версию 2.3.4.5.
-- ПОДСКАЗКА: Пересоберите все объекты, затрагиваемые этим правилом сортировки и выполните ALTER COLLATION pg_catalog."xx-x-icu" REFRESH VERSION или соберите QHB с корректной версией библиотеки

Изменение определений правил сортировки может привести к разрушению индексов и другим проблемам, поскольку СУБД рассчитывает, что хранимые объекты имеют определенный порядок сортировки. В целом, подобного следует избегать, но это может произойти в легитимных обстоятельствах, например при обновлении с помощью qhb_upgrade двоичных файлов сервера, скомпилированных с более новой версией ICU. Когда это происходит, все объекты, зависящие от правил сортировки, должны быть перестроены, например, с помощью REINDEX. После этого можно обновить версию правил сортировки, выполнив команду ALTER COLLATION ... REFRESH VERSION. Это обновит системный каталог, и в него будет записана текущая версия сортировщика, а предупреждение исчезнет. Обратите внимание, что при выполнении команды фактически не проверяется, все ли затронутые объекты были перестроены правильно.

Когда применяются правила сортировки, предоставляемые libc, в системах, использующих библиотеку GNU C (большинство систем Linux systems) и FreeBSD, информация о версии записывается.

Примечание
При использовании для правил сортировки библиотеки GNU C, версия библиотеки C служит показателем версии правила. Во многих дистрибутивах Linux определения правил сортировки меняются только при обновлении библиотеки 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;

Примеры

Переименование правила сортировки 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