ALTER TYPE

ALTER TYPE — modifica a definição de um tipo de dados

Sinopse

ALTER TYPE nome​
    OWNER TO {
        novo_dono
      | CURRENT_ROLE
      | CURRENT_USER
      | SESSION_USER
    }
ALTER TYPE nome​
    RENAME TO novo_nome
ALTER TYPE nome​
    SET SCHEMA novo_esquema
ALTER TYPE nome​
    RENAME ATTRIBUTE nome_do_atributo TO novo_nome_do_atributo​
    [ CASCADE | RESTRICT ]
ALTER TYPE nomeação [, ... ]
ALTER TYPE nome​
    ADD VALUE [ IF NOT EXISTS ] novo_valor_enum​
    [ { BEFORE | AFTER } valor_enum_vizinho ]
ALTER TYPE nome​
    RENAME VALUE valor_enum_existente TO novo_valor_enum
ALTER TYPE nome​
    SET ( propriedade = valor [, ... ] )

onde ação é uma entre:

    ADD ATTRIBUTE nome_do_atributo tipo_de_dados​
        [ COLLATE ordenação ]​
        [ CASCADE | RESTRICT ]
    DROP ATTRIBUTE [ IF EXISTS ] nome_do_atributo​
        [ CASCADE | RESTRICT ]
    ALTER ATTRIBUTE nome_do_atributo​
        [ SET DATA ] TYPE tipo_de_dados​
        [ COLLATE ordenação ]​
        [ CASCADE | RESTRICT ]

Descrição

O comando ALTER TYPE altera a definição de um tipo de dados existente. Existem várias subformas:

OWNER

Esta forma altera o dono do tipo de dados.

RENAME

Esta forma altera o nome do tipo de dados.

SET SCHEMA

Esta forma move o tipo de dados para outro esquema.

RENAME ATTRIBUTE

Esta forma só pode ser usada com tipos de dados compostos. Altera o nome de um atributo individual do tipo de dados.

ADD ATTRIBUTE

Esta forma adiciona um novo atributo a um tipo de dados composto, usando a mesma sintaxe de CREATE TYPE.

DROP ATTRIBUTE [ IF EXISTS ]

Esta forma remove um atributo de um tipo de dados composto. Se for especificado IF EXISTS e o atributo não existir, não será relatado nenhum erro. É emitido um aviso neste caso.

ALTER ATTRIBUTE ... SET DATA TYPE

Esta forma altera o tipo de dados de um atributo do tipo de dados composto.

ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]

Esta forma adiciona um novo valor a um tipo de dados enum. O lugar do novo valor na ordem da enumeração pode ser especificado como sendo BEFORE ou AFTER (antes ou após) um dos valores existentes. Caso contrário, o novo item será adicionado no final da lista de valores.

Se for especificado IF NOT EXISTS, não será relatado um erro se o tipo de dados já contiver o novo valor: será emitido um aviso neste caso, mas nenhuma outra ação será tomada. Caso contrário, será relatado um erro se o novo valor já estiver presente.

RENAME VALUE

Esta forma altera o nome de um valor do tipo de dados enumerado. A posição do valor na ordem da enumeração não é afetada. Será relatado um erro se o valor especificado não estiver presente, ou se o novo nome já estiver presente.

SET ( propriedade = valor [, ... ] )

Esta forma só é aplicável aos tipos de dados base. Permite o ajuste de um subconjunto das propriedades do tipo de dados base que podem ser definidas no comando CREATE TYPE. Especificamente, as seguintes propriedades podem ser alteradas:

  • Para RECEIVE pode ser atribuído o nome da função de entrada binária, ou NONE para remover a função de entrada binária do tipo de dados. O uso dessa opção requer privilégio de superusuário.

  • Para SEND pode ser atribuído o nome da função de saída binária, ou NONE para remover a função de saída binária do tipo de dados. O uso dessa opção requer privilégio de superusuário.

  • Para TYPMOD_IN pode ser atribuído o nome da função de entrada do modificador de tipo de dados, ou NONE para remover a função de entrada do modificador de tipo de dados do tipo de dados. O uso dessa opção requer privilégio de superusuário.

  • Para TYPMOD_OUT pode ser atribuído o nome da função de saída do modificador de tipo de dados, ou NONE para remover a função de saída do modificador de tipo de dados do tipo de dados. O uso dessa opção requer privilégio de superusuário.

  • Para ANALYZE pode ser atribuído o nome da função de coleta de estatísticas específica do tipo de dados, ou NONE para remover a função de coleta de estatísticas do tipo de dados. O uso dessa opção requer privilégio de superusuário.

  • Para SUBSCRIPT pode ser atribuído o nome da função tratadora de índice específica do tipo de dados, ou NONE para remover a função tratadora de índice do tipo de dados. O uso dessa opção requer privilégio de superusuário.

  • Para STORAGE pode ser atribuído plain, extended, external, ou main (veja TOAST para obter mais informações sobre o que significam). Entretanto, mudar de plain para outra configuração requer o privilégio de superusuário (porque requer que todas as funções C do tipo de dados estejam prontas para TOAST), e mudar para plain de outra configuração não é permitido (porque o tipo de dados já pode ter valores TOAST presentes no banco de dados). Note que por si só alterar esta opção não altera nenhum dado armazenado, apenas define a estratégia TOAST padrão a ser usada para colunas da tabela criadas posteriormente. Veja ALTER TABLE para alterar a estratégia de TOAST para colunas de tabela existentes.

Veja CREATE TYPE para obter mais detalhes sobre estas propriedades de tipo de dados. Note que, quando apropriado, uma alteração nessas propriedades para um tipo de dados base será propagada automaticamente para os domínios com base neste tipo de dados.

As ações ADD ATTRIBUTE, DROP ATTRIBUTE, e ALTER ATTRIBUTE, podem ser combinadas em uma lista de múltiplas alterações a serem aplicadas em paralelo. Por exemplo, é possível adicionar vários atributos e/ou alterar o tipo de dados de vários atributos em um único comando.

É necessário ser o dono do tipo de dados para executar o comando ALTER TYPE. Para alterar o esquema do tipo de dados, também é necessário ter o privilégio CREATE no novo esquema. 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 do tipo de dados. (Estas restrições impõem que alterar o dono não faz nada que não poderia ser feito excluindo e recriando o tipo de dados. Entretanto, um superusuário pode alterar o dono de qualquer tipo de dados.) Para adicionar um atributo, ou alterar o tipo de dados de um atributo, também é necessário ter o privilégio USAGE no tipo de dados do atributo.

Parâmetros

nome

O nome (possivelmente qualificado pelo esquema) do tipo de dados existente a ser alterado.

novo_nome

O novo nome para o tipo de dados.

novo_dono

O nome de usuário do novo dono do tipo de dados.

novo_esquema

O novo esquema para o tipo de dados.

nome_do_atributo

O nome do atributo a ser adicionado, alterado ou removido.

novo_nome_do_atributo

O novo nome do atributo a ser renomeado.

tipo_de_dados

O tipo de dados do atributo a ser adicionado, ou o novo tipo de dados do atributo a ser alterado.

novo_valor_enum

O novo valor a ser adicionado à lista de valores do tipo de dados enum, ou o novo nome a ser dado a um valor existente. Como todos os literais de enumeração, precisa estar entre apóstrofos.

valor_enum_vizinho

O valor de enumeração existente ao qual o novo valor deve ser adicionado imediatamente antes ou depois na ordem de classificação do tipo de dados enum. Como todos os literais de enumeração, precisa estar entre apóstrofos.

valor_enum_existente

O valor de enumeração existente a ser renomeado. Como todos os literais de enumeração, precisa estar entre apóstrofos.

propriedade

O nome da propriedade do tipo de dados base a ser modificada; veja acima os valores possíveis.

CASCADE

Propaga, automaticamente, a operação no tipo de dados que está sendo alterado para as tabelas tipadas e suas descendentes.

RESTRICT

Recusa a operação se o tipo de dados que está sendo alterado for o tipo de dados de uma tabela tipada. Este é o comportamento padrão.

Notas

Se ALTER TYPE ... ADD VALUE (a forma que adiciona um novo valor a um tipo de dados enum) for executado em um bloco de transação, o novo valor não poderá ser usado até que a transação tenha sido efetivada.

Às vezes, as comparações envolvendo um valor de enumeração adicionado serão mais lentas do que as comparações envolvendo apenas os membros originais do tipo de dados enum. Isto geralmente ocorrerá apenas se for usado BEFORE ou AFTER para definir a posição de classificação do novo valor em algum lugar diferente do final da lista. No entanto, às vezes isto acontece mesmo que o novo valor seja adicionado no final (isto ocorre quando o contador OID volta ao início após a criação original do tipo de dados enum). A desaceleração é geralmente insignificante; mas se for importante, o desempenho ideal poderá ser recuperado removendo e recriando o tipo de dados enum, ou fazendo uma cópia de segurança e recuperando o banco de dados.

Exemplos

Para mudar o nome de um tipo de dados:

ALTER TYPE correio_eletrônico RENAME TO email;

Para alterar o dono do tipo de dados email para joe:

ALTER TYPE email OWNER TO joe;

Para alterar o esquema do tipo de dados email para clientes:

ALTER TYPE email SET SCHEMA clientes;

Para adicionar um novo atributo a um tipo de dados composto:

ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

Para adicionar um novo valor a um tipo de dados enum em uma posição de classificação específica:

ALTER TYPE cores ADD VALUE 'laranja' AFTER 'vermelho';

Para mudar o nome de um valor de enumeração:

ALTER TYPE cores RENAME VALUE 'púrpura' TO 'lilás';

Para criar funções de E/S binárias para um tipo de dados base existente:

CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
    SEND = mytypesend,
    RECEIVE = mytyperecv
);

Conformidade

As variantes para adicionar e remover atributos fazem parte do padrão SQL; as demais variantes são extensões do PostgreSQL.

Veja também

CREATE TYPE, DROP TYPE