ALTER COLLATION — 變更排序規則的定義
ALTER COLLATIONname
REFRESH VERSION ALTER COLLATIONname
RENAME TOnew_name
ALTER COLLATIONname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONname
SET SCHEMAnew_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
陳述式。
如果您在文件中發現任何不正確、與特定功能不符或需要進一步澄清的地方,請使用此表單報告文件問題。