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
を使用するためには照合順序を所有していなければなりません。
所有者を変更するためには、新しい所有ロールの直接あるいは間接的なメンバでなければならず、かつ、そのロールが照合順序のスキーマにおけるCREATE
権限を持たなければなりません
(この制限により、照合順序の削除と再作成を行ってもできないことが所有者の変更で行えないようにします。
ただし、スーパーユーザはすべての照合順序の所有者を変更することができます)。
name
既存の照合順序の名前(スキーマ修飾可)です。
new_name
照合順序の新しい名前です。
new_owner
照合順序の新しい所有者です。
new_schema
照合順序の新しいスキーマです。
REFRESH VERSION
照合順序のバージョンを更新します。 以下のNotesを参照してください。
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 PostgreSQL with the right library version.
データベースシステムは、保存されたオブジェクトが一定のソート順になっていることに依存しているため、照合順序を変更するとインデックスが破損するなどといった問題につながります。
一般的にこれは避けるべきですが、pg_upgrade
を使って新しいバージョンのICUライブラリとリンクされたサーバのバイナリへとアップグレードする場合など、仕方のない場合もあります。
これが発生する場合は、照合順序に依存するすべてのオブジェクトを、例えばREINDEX
を使って再構築します。
これがされれば、照合順序のバージョンをコマンドALTER COLLATION ... REFRESH VERSION
を使って更新できます。
これにより、システムカタログが更新されて照合器の現在のバージョンが記録され、警告が出なくなります。
これは、影響を受けるすべてのオブジェクトが正しく再構築されたかどうかを実際に確認するわけではないことに注意してください。
libc
が提供する照合順序を使う場合、GNU Cライブラリ(ほとんどのLinuxシステム)、FreeBSD、Windowsを使ってバージョン情報がシステムに記録されます。
照合順序にGNU Cライブラリを使う場合、Cライブラリのものは照合順序のプロキシとして使われます。 多くのLinuxのディストリビューションではCライブラリをアップデートする時にのみ照合順序の定義を変更しますが、メンテナは新しい照合順序の定義を古いCライブラリのリリースに自由にバックポートできますので、この方法は不完全なものです。
照合順序にWindowsを使う場合、バージョン情報は、en-US
のようなBCP 47言語タグで定義された照合順序のみが利用可能です。
今のところ、データベースのデフォルトの照合順序に対するバージョン追跡はありません。
以下の問い合わせを使って、現在のデータベース内の更新が必要なすべての照合順序と、それに依存するオブジェクトを特定することができます。
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
文はありません。