PostgreSQL ALTER COLLATION

2021-09-06 14:39 更新

ALTER COLLATION — 更改一個(gè)排序規(guī)則的定義

大綱

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

描述

ALTER COLLATION更改一個(gè)排序規(guī)則的定義。

你必須擁有要對(duì)其使用ALTER COLLATION的排序規(guī)則。要更改擁有者,你必須是新的擁有角色的直接或者間接成員,并且該角色必須在排序規(guī)則的模式上具有CREATE特權(quán)(這些限制強(qiáng)制要求擁有者不能通過(guò)丟棄并重建該排序規(guī)則來(lái)做任何你不能做的事情。不過(guò),一個(gè)超級(jí)用戶可以更改任何排序規(guī)則的所有權(quán))。

參數(shù)

name

一個(gè)現(xiàn)有排序規(guī)則的名稱(可以是模式限定的)。

new_name

排序規(guī)則的新名稱。

new_owner

排序規(guī)則的新?lián)碛姓摺?/p>

new_schema

排序規(guī)則的新模式。

REFRESH VERSION

更新排序規(guī)則的版本。 參閱下面的Notes。

注意

使用ICU庫(kù)提供的排序規(guī)則時(shí),創(chuàng)建排序規(guī)則對(duì)象時(shí),系統(tǒng)目錄中會(huì)記錄排序規(guī)則的特定ICU版本。 使用排序規(guī)則時(shí),將根據(jù)記錄的版本檢查當(dāng)前版本,并在發(fā)生不匹配時(shí)發(fā)出警告,例如:

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.

排序規(guī)則定義的更改會(huì)導(dǎo)致索引損壞和其他問(wèn)題,因?yàn)閿?shù)據(jù)庫(kù)系統(tǒng)依賴于具有特定排序順序的存儲(chǔ)對(duì)象。 通常,應(yīng)該避免這種情況,但它可以在合法的情況下發(fā)生,例如使用pg_upgrade 升級(jí)到與更新版本的ICU鏈接的服務(wù)器二進(jìn)制文件。發(fā)生這種情況時(shí), 應(yīng)該重建所有依賴于該排序規(guī)則的對(duì)象,例如,使用REINDEX。 完成后,使用命令ALTER COLLATION ... REFRESH VERSION可以刷新排序規(guī)則版本。 這將更新系統(tǒng)目錄以記錄當(dāng)前的排序規(guī)則版本,并會(huì)使警告消失。請(qǐng)注意, 這實(shí)際上并不檢查是否所有受影響的對(duì)象都已正確重建。

使用 libc 提供的排序規(guī)則,并且 PostgreSQL 是使用GNU C庫(kù)構(gòu)建的,則將C庫(kù)的版本用作排序規(guī)則版本。由于排序規(guī)則定義通常僅隨GNU C庫(kù)發(fā)行版而更改, 因此可以提供一些防止損壞的防御措施,但它并不是完全可靠的。

當(dāng)前,沒(méi)有針對(duì)數(shù)據(jù)庫(kù)默認(rèn)排序規(guī)則的版本跟蹤。

以下查詢可用于識(shí)別當(dāng)前數(shù)據(jù)庫(kù)中需要刷新的所有排序規(guī)則以及依賴它們的對(duì)象:

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;

例子

要把排序規(guī)則de_DE重命名為german

ALTER COLLATION "de_DE" RENAME TO german;

要把排序規(guī)則en_US的擁有者改成joe

ALTER COLLATION "en_US" OWNER TO joe;

兼容性

在 SQL 標(biāo)準(zhǔn)中沒(méi)有ALTER COLLATION語(yǔ)句。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)