ALTER COLLATION

ALTER COLLATION — cambiar la definición de una intercalación

Synopsis

ALTER COLLATION name REFRESH VERSION

ALTER COLLATION name RENAME TO new_name
ALTER COLLATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER COLLATION name SET SCHEMA new_schema

Descripción

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).

Parámetros

name

El nombre (opcionalmente calificado por esquema) de una intercalación existente.

new_name

El nuevo nombre de la intercalación.

new_owner

El nuevo propietario de la intercalación.

new_schema

El nuevo esquema para la intercalación.

REFRESH VERSION

Actualiza la versión de la intercalación. Consulta Notas más abajo.

Notas

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.

Note

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;

Ejemplos

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;

Compatibilidad

No existe la sentencia ALTER COLLATION en el estándar SQL.

Véase también

CREATE COLLATION, DROP COLLATION