ALTER COLLATION

ALTER COLLATION — modifica a definição de uma ordenação

Sinopse

ALTER COLLATION nome​
    REFRESH VERSION
ALTER COLLATION nome​
    RENAME TO novo_nome
ALTER COLLATION nome​
    OWNER TO {
        novo_dono
      | CURRENT_ROLE
      | CURRENT_USER
      | SESSION_USER
    }
ALTER COLLATION nome​
    SET SCHEMA novo_esquema

Descrição

O comando ALTER COLLATION modifica a definição de uma ordenação.

É necessário ser o dono da ordenação para poder executar o comando ALTER COLLATION. Para alterar o dono, é necessário ser capaz de executar o comando SET ROLE para a função de banco de dados (role) que será a nova dona, e esta função de banco de dados precisa possuir o privilégio CREATE no esquema da ordenação. (Estas restrições impõem que alterar o dono não faz nada que não poderia ser feito excluindo e recriando a ordenação. Entretanto, um superusuário pode alterar o dono de qualquer ordenação.)

Parâmetros

nome

O nome (opcionalmente qualificado pelo esquema) da ordenação existente.

novo_nome

O novo nome da ordenação.

novo_dono

O novo dono da ordenação.

novo_esquema

O novo esquema da ordenação.

REFRESH VERSION

Atualiza a versão da ordenação. Veja Notas abaixo para obter mais detalhes.

Notes

Quando um objeto de ordenação é criado, a versão específica do provedor da ordenação é registrada no catálogo do sistema. Quando a ordenação é utilizada, a versão corrente é comparada com a versão registrada, e um aviso é emitido quando há uma incompatibilidade, por exemplo:

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.

Uma mudança nas definições de ordenação pode levar à corrupção de índices e outros problemas, porque o sistema de banco de dados depende de que os objetos armazenados tenham uma determinada ordem de classificação. Geralmente, isto deve ser evitado, mas pode acontecer em circunstâncias legítimas, como ao atualizar o sistema operacional para uma nova versão principal ou ao usar o comando pg_upgrade para atualizar os binários de servidor vinculados para uma versão mais recente do ICU (International Components for Unicode). Quando isto acontece, todos os objetos que dependem da ordenação devem ser reconstruídos usando, por exemplo, o comando REINDEX. Feito isto, a versão de ordenação pode ser atualizada usando o comando ALTER COLLATION ... REFRESH VERSION. Isto irá atualizar o catálogo do sistema para registrar a versão de ordenação corrente e fará com que a advertência desapareça. Note que isto não verifica se todos os objetos afetados foram reconstruídos corretamente.

Ao usar as ordenações fornecidas pela libc, a informação de versão é registrada em sistemas que utilizam a biblioteca GNU C (a maioria dos sistemas Linux), FreeBSD e Windows. Ao usar as ordenações fornecidas pela ICU, as informações de versão são fornecidas pela biblioteca da ICU e estão disponíveis em todas as plataformas.

Nota

Ao usar a biblioteca GNU C para ordenações, a versão da biblioteca C é usada como um proxy para a versão da ordenação. Muitas distribuições do Linux alteram as definições de ordenação apenas ao atualizar a biblioteca C, mas esta abordagem é imperfeita, porque os mantenedores são livres para fazer um back-port de definições de ordenação mais recentes para versões mais antigas da biblioteca C.

Ao usar o Windows para ordenações, as informações de versão estão disponíveis apenas para ordenações definidas com etiquetas de idioma BCP 47, como en-US.

Para a ordenação padrão do banco de dados existe o comando análogo ALTER DATABASE ... REFRESH COLLATION VERSION.

A seguinte consulta pode ser usada para identificar todas as ordenações (collations) no banco de dados corrente que precisam ser atualizadas e os objetos que dependem delas:

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;

Exemplos

Para alterar o nome da ordenação de_DE para german:

ALTER COLLATION "de_DE" RENAME TO german;

Para alterar o dono da ordenação en_US para joe:

ALTER COLLATION "en_US" OWNER TO joe;

Conformidade

Não existe o comando ALTER COLLATION no padrão SQL.

Veja também

CREATE COLLATION, DROP COLLATION