ALTER COLLATION — modifica a definição de uma ordenação
ALTER COLLATIONnome REFRESH VERSION ALTER COLLATIONnome RENAME TOnovo_nomeALTER COLLATIONnome OWNER TO {novo_dono| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER COLLATIONnome SET SCHEMAnovo_esquema
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.)
nomeO nome (opcionalmente qualificado pelo esquema) da ordenação existente.
novo_nomeO novo nome da ordenação.
novo_donoO novo dono da ordenação.
novo_esquemaO novo esquema da ordenação.
REFRESH VERSIONAtualiza a versão da ordenação. Veja Notas abaixo para obter mais detalhes.
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.
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;
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;
Não existe o comando ALTER COLLATION no padrão
SQL.