ALTER COLLATION
更改一個排序規則的定義。
簡介
你必須擁有要對其使用ALTER COLLATION
的排序規則。要更改擁有者,你必須是新的擁有角色的直接或者間接成員,并且該角色必須在排序規則的模式上具有CREATE
特權(這些限制強制要求擁有者不能通過丟棄并重建該排序規則來做任何你不能做的事情。不過,一個超級用戶可以更改任何排序規則的所有權)。
語法
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
參數
name
一個現有排序規則的名稱(可以是模式限定的)。
new_name
排序規則的新名稱。
new_owner
排序規則的新擁有者。
new_schema
排序規則的新模式。
REFRESH VERSION
更新排序規則的版本。
說明
使用 ICU 庫提供的排序規則時,創建排序規則對象時,系統目錄中會記錄排序規則的特定 ICU 版本。 使用排序規則時,將根據記錄的版本檢查當前版本,并在發生不匹配時發出警告,例如:
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 PolarDB with the right library version.
排序規則定義的更改會導致索引損壞和其他問題,因為數據庫系統依賴于具有特定排序順序的存儲對象。 通常,應該避免這種情況,但它可以在合法的情況下發生,例如使用pg_upgrade
升級到與更新版本的 ICU 鏈接的服務器二進制文件。發生這種情況時, 應該重建所有依賴于該排序規則的對象,例如,使用REINDEX
。 完成后,使用命令ALTER COLLATION ... REFRESH VERSION
可以刷新排序規則版本。 這將更新系統目錄以記錄當前的排序規則版本,并會使警告消失。請注意, 這實際上并不檢查是否所有受影響的對象都已正確重建。
使用 libc
提供的排序規則,并且 PolarDB 是使用 GNU C 庫構建的,則將 C 庫的版本用作排序規則版本。由于排序規則定義通常僅隨 GNU C 庫發行版而更改, 因此可以提供一些防止損壞的防御措施,但它并不是完全可靠的。
當前,沒有針對數據庫默認排序規則的版本跟蹤。
以下查詢可用于識別當前數據庫中需要刷新的所有排序規則以及依賴它們的對象:
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;