支援的版本:目前版本 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

ALTER COLLATION

ALTER COLLATION — 變更排序規則的定義

概要

ALTER COLLATION name REFRESH VERSION

ALTER COLLATION name RENAME TO new_name
ALTER COLLATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER COLLATION name SET SCHEMA new_schema

描述

ALTER COLLATION 變更排序規則的定義。

您必須擁有排序規則才能使用 ALTER COLLATION。要變更擁有者,您必須能夠 SET ROLE 為新的擁有角色,並且該角色必須在排序規則的綱要上具有 CREATE 權限。(這些限制強制執行變更擁有者不會執行您無法透過刪除並重新建立排序規則來完成的任何事情。但是,超級使用者無論如何都可以變更任何排序規則的擁有權。)

參數

name

現有排序規則的名稱(可選擇使用綱要限定)。

new_name

排序規則的新名稱。

new_owner

排序規則的新擁有者。

new_schema

排序規則的新綱要。

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 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 陳述式。

提交更正

如果您在文件中發現任何不正確、與特定功能不符或需要進一步澄清的地方,請使用此表單報告文件問題。