ALTER COLLATION
ALTER COLLATION — изменить определение правила сортировки
Синтаксис
ALTER COLLATION имя REFRESH VERSION
ALTER COLLATION имя RENAME TO новое_имя
ALTER COLLATION имя OWNER TO { новый_владелец | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER COLLATION имя SET SCHEMA новая_схема
Описание
Команда ALTER COLLATION изменяет определение правила сортировки.
Чтобы использовать команду ALTER COLLATION, нужно быть владельцем соответствующего
правила сортировки. Для смены владельца нужно иметь возможность выполнять SET ROLE для новой роли-владельца, и эта роль должна иметь право CREATE в схеме
правила сортировки. (Эти ограничения направлены на то, чтобы при смене владельца
не происходило ничего, что нельзя было бы сделать путем удаления и повторного
создания правила сортировки. Однако суперпользователь все равно может сменить
владельца любого правила сортировки.)
Параметры
имя
Имя существующего правила сортировки (может быть дополнено схемой).
новое_имя
Новое имя правила сортировки.
новый_владелец
Новый владелец правила сортировки.
новая_схема
Новая схема для правила сортировки.
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 QHB 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, информация о версии записывается. При применении правил сортировки, предоставляемых ICU, информация о версии предоставляется библиотекой ICU и доступна на всех платформах.
Примечание
При использовании для правил сортировки библиотеки GNU C версия библиотеки C служит показателем версии правила. Во многих дистрибутивах Linux определения правил сортировки меняются только при обновлении библиотеки C, но такой подход неидеален, поскольку авторы дистрибутива вполне могут перенести обновленные определения правил сортировки обратно в старые версии библиотеки C.
Для правила сортировки по умолчанию для базы данных имеется аналогичная команда
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.