ALTER COLLATION — modifie la définition d'une collation
ALTER COLLATIONname
REFRESH VERSION ALTER COLLATIONnom
RENAME TOnouveau_nom
ALTER COLLATIONnom
OWNER TO {nouveau_propriétaire
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONnom
SET SCHEMAnouveau_schéma
ALTER COLLATION
modifie la définition d'une collation.
Vous devez être propriétaire de la collation pour utiliser ALTER
COLLATION
. Pour en modifier le propriétaire, vous devez également
être un membre direct ou indirect du nouveau rôle propriétaire, et ce rôle
doit détenir le droit CREATE
sur le schéma de la
collation. (Ces restrictions garantissent que, en modifiant le propriétaire,
vous ne pouvez rien faire qui ne soit impossible en supprimant et en recréant
la collation. De toute manière, un superutilisateur peut modifier le
propriétaire de n'importe quelle collation.)
nom
Le nom (éventuellement précédé par le schéma) d'une collation existante.
nouveau_nom
Le nouveau nom de la collation.
nouveau_propriétaire
Le nouveau propriétaire de la collation.
nouveau_schéma
Le nouveau schéma de la collation.
REFRESH VERSION
Met à jour la version de la collation. Voir Notes ci-dessous.
Quand un objet de collation est créé, la version spécifique du fournisseur de la collation est enregistrée dans le catalogue système. Quand la collation est utilisée, la version courante est comparée à la version enregistrée, et un avertissement est émis en cas d'incompatibilité, par exemple :
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.
Un changement dans des définitions de collations peut entraîner des
corruptions d'index et d'autres problèmes, car le moteur de la base de
données s'appuie sur le fait que les objets stockées ont un certain ordre. En
général, cela devrait être évité, mais cela peut néanmoins arriver dans
certaines circonstances légitimes, telles que la mise à jour d'un système
d'exploitation vers une nouvelle version majeure ou comme l'utilisation de
pg_upgrade
pour mettre à jour vers des binaires du serveur
liés à une version plus récente d'ICU. Dans ces circonstances, tous les
objets dépendants de cette collation doivent être reconstruits, par exemple
avec REINDEX
. Cette opération terminée, la version de la
collation peut être rafraîchie avec la commande ALTER COLLATION ...
REFRESH VERSION
. Elle mettra à jour le catalogue système avec la
version courante de la collation et l'avertissement ne s'affichera plus.
Notez que la commande ne vérifie pas que tous les objets affectés ont été
reconstruits correctement.
Avec les collations fournies par la libc
, l'information
sur la version est enregistrée sur les systèmes utilisant la bibliothèque C
GNU (soit la plupart des systèmes sous Linux), sur FreeBSD, et Windows. Lors
de l'utilisation de collations fournies par ICU, l'information de version est
fournie par la bibliothèque ICU et est disponible sur toutes les plateformes.
Si les collations utilisent la bibliothèque C GNU, la version de la bibliothèque C est utilisée comme proxy pour la version de la collation. Beaucoup de distributions Linux ne changent les définitions de collation que lors des mises à jour de la bibliothèque C. Cette approche pose problème, car les mainteneurs sont libres de rétroporter des définitions de collation récentes vers des versions anciennes de la bibliothèque C.
Si les collations utilisent celles de Windows, l'information de version
n'est disponible que pour celles définies avec des étiquettes
d'identification de langue BCP 47, par exemple
en-US
.
Pour la collation par défaut de la base, il existe une commande analogue
appelée ALTER DATABASE ... REFRESH COLLATION VERSION
.
La requête suivante peut être utilisée pour identifier toutes les collations de la base de données courante qui nécessitent d'être rafraîchies, ainsi que tous les objets qui en dépendent :
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;
Pour renommer la collation de_DE
en
german
:
ALTER COLLATION "de_DE" RENAME TO german;
Pour changer le propriétaire la propriété de la collation
en_US
par joe
:
ALTER COLLATION "en_US" OWNER TO joe;
Il n'y a pas de commande ALTER COLLATION
dans le standard
SQL.