=============== ALTER COLLATION =============== .. container:: refentry :name: SQL-ALTERCOLLATION .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER COLLATION :name: alter-collation ALTER COLLATION — 更改一个排序规则的定义 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis ALTER COLLATION name REFRESH VERSION ALTER COLLATION name RENAME TO new_name ALTER COLLATION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } ALTER COLLATION name SET SCHEMA new_schema .. container:: refsect1 :name: id-1.9.3.5.5 .. rubric:: 描述 :name: 描述 ``ALTER COLLATION``\ 更改一个排序规则的定义。 你必须拥有要对其使用\ ``ALTER COLLATION``\ 的排序规则。要更改拥有者,你必须是新的拥有角色的直接或者间接成员,并且该角色必须在排序规则的模式上具有\ ``CREATE``\ 特权(这些限制强制要求拥有者不能通过丢弃并重建该排序规则来做任何你不能做的事情。不过,一个超级用户可以更改任何排序规则的所有权)。 .. container:: refsect1 :name: id-1.9.3.5.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``name``* 一个现有排序规则的名称(可以是模式限定的)。 *``new_name``* 排序规则的新名称。 *``new_owner``* 排序规则的新拥有者。 *``new_schema``* 排序规则的新模式。 ``REFRESH VERSION`` 更新排序规则的版本。 .. container:: refsect1 :name: SQL-ALTERCOLLATION-NOTES .. rubric:: 注意 :name: 注意 使用ICU库提供的排序规则时,创建排序规则对象时,系统目录中会记录排序规则的特定ICU版本。 使用排序规则时,将根据记录的版本检查当前版本,并在发生不匹配时发出警告,例如: .. code:: screen 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``\ 可以刷新排序规则版本。 这将更新系统目录以记录当前的排序规则版本,并会使警告消失。请注意, 这实际上并不检查是否所有受影响的对象都已正确重建。 以下查询可用于识别当前数据库中需要刷新的所有排序规则以及依赖它们的对象: .. code:: programlisting 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; .. container:: refsect1 :name: id-1.9.3.5.8 .. rubric:: 例子 :name: 例子 要把排序规则\ ``de_DE``\ 重命名为\ ``german``\ : .. code:: programlisting ALTER COLLATION "de_DE" RENAME TO german; 要把排序规则\ ``en_US``\ 的拥有者改成\ ``joe``\ : .. code:: programlisting ALTER COLLATION "en_US" OWNER TO joe; .. container:: refsect1 :name: id-1.9.3.5.9 .. rubric:: 兼容性 :name: 兼容性 在 SQL 标准中没有\ ``ALTER COLLATION``\ 语句。