ALTER COLLATION — 修改排序规则的定义
ALTER COLLATIONnameREFRESH VERSION ALTER COLLATIONnameRENAME TOnew_nameALTER COLLATIONnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONnameSET SCHEMAnew_schema
ALTER COLLATION 修改排序规则的定义。
你必须拥有该排序规则才能使用 ALTER COLLATION。要更改所有者,你必须能够 SET ROLE 到新的拥有角色,并且该角色必须在排序规则所在模式上拥有 CREATE 特权。
(这些限制强制确保:更改所有者不会让你做到删除并重建排序规则做不到的事情。不过,超级用户无论如何都可以更改任何排序规则的所有权。)
name现有排序规则的名称(可选带模式限定)。
new_name排序规则的新名称。
new_owner排序规则的新所有者。
new_schema排序规则的新模式。
REFRESH VERSION更新排序规则的版本。参见下文 Notes。
创建排序规则对象时,该排序规则的提供者特定版本会记录在系统目录中。使用该排序规则时,当前版本会与记录的版本进行比对,如果存在不匹配就会发出警告,例如:
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 语句。