ALTER COLLATION — cambiar la definición de una intercalación
ALTER COLLATIONnameREFRESH VERSION ALTER COLLATIONnameRENAME TOnew_nameALTER COLLATIONnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONnameSET SCHEMAnew_schema
ALTER COLLATION cambia la definición de una
intercalación.
Debes ser el propietario de la intercalación para poder usar ALTER COLLATION.
Para cambiar el propietario, debes poder hacer SET ROLE al
nuevo rol propietario, y ese rol debe tener el privilegio CREATE
en el esquema de la intercalación.
(Estas restricciones garantizan que al cambiar el propietario no puedas hacer nada
que no pudieras hacer eliminando y recreando la intercalación. Sin embargo, un superusuario
puede cambiar la propiedad de cualquier intercalación de todos modos).
nameEl nombre (opcionalmente calificado por esquema) de una intercalación existente.
new_nameEl nuevo nombre de la intercalación.
new_ownerEl nuevo propietario de la intercalación.
new_schemaEl nuevo esquema para la intercalación.
REFRESH VERSIONActualiza la versión de la intercalación. Consulta Notas más abajo.
Cuando se crea un objeto de intercalación, la versión específica del proveedor de la intercalación se registra en el catálogo del sistema. Cuando se utiliza la intercalación, se comprueba la versión actual frente a la versión registrada y se emite una advertencia cuando hay una discrepancia, por ejemplo:
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 cambio en las definiciones de intercalación puede provocar índices corruptos y otros
problemas, ya que el sistema de la base de datos depende de que los objetos almacenados tengan un
orden de clasificación determinado. En general, esto debería evitarse, pero puede ocurrir
en circunstancias legítimas, como al actualizar el sistema operativo a una nueva versión mayor o
al usar pg_upgrade para actualizar a binarios de servidor vinculados
con una versión más nueva de ICU. Cuando esto sucede, todos los objetos que dependan de
la intercalación deben reconstruirse, por ejemplo, mediante REINDEX.
Una vez hecho esto, la versión de la intercalación se puede actualizar usando el comando
ALTER COLLATION ... REFRESH VERSION. Esto actualizará el catálogo del sistema para
registrar la versión de intercalación actual y hará que desaparezca la advertencia. Ten en cuenta que
esto no comprueba realmente si todos los objetos afectados se han reconstruido correctamente.
Cuando se utilizan intercalaciones proporcionadas por libc, la información de la
versión se registra en sistemas que utilizan la biblioteca GNU C (la mayoría de los sistemas Linux),
FreeBSD y Windows. Cuando se utilizan intercalaciones proporcionadas por ICU, la información de la
versión es proporcionada por la biblioteca ICU y está disponible en todas las plataformas.
Al usar la biblioteca GNU C para intercalaciones, se utiliza la versión de la biblioteca C como un proxy de la versión de la intercalación. Muchas distribuciones de Linux cambian las definiciones de intercalación solo al actualizar la biblioteca C, pero este enfoque es imperfecto ya que los mantenedores son libres de incorporar (back-port) definiciones de intercalación más nuevas a versiones anteriores de la biblioteca C.
Al usar Windows para intercalaciones, la información de la versión solo está disponible para
intercalaciones definidas con etiquetas de idioma BCP 47 como en-US.
Para la intercalación predeterminada de la base de datos, existe un comando análogo:
ALTER DATABASE ... REFRESH COLLATION VERSION.
Se puede utilizar la siguiente consulta para identificar todas las intercalaciones en la base de datos actual que necesitan actualizarse y los objetos que dependen de ellas:
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;
Para renombrar la intercalación de_DE a
german:
ALTER COLLATION "de_DE" RENAME TO german;
Para cambiar el propietario de la intercalación en_US a
joe:
ALTER COLLATION "en_US" OWNER TO joe;
No existe la sentencia ALTER COLLATION en el
estándar SQL.