Alterar tamanho de um campo em banco de dados PostgreSQL

No PostgreSQL, se o desenvolvedor tenta atualizar o tamanho de um campo, por exemplo de varchar(255) para varchar(512), o comando utilizado seria algo semelhante a este:

ALTER TABLE nome_da_tabela ALTER COLUMN nome_da_coluna TYPE varchar(512)

Porem se este campo está em alguma view, trigger ou procedimento armazenado do banco de dados, provavelmente o PostgreSQL vai exibir uma mensagem como esta:

ERROR:  cannot alter type of a column used by a view or rule
DETAIL:  rule _RETURN on view nome_da_view depends on column "nome_da_coluna"
********** Error **********
ERROR: cannot alter type of a column used by a view or rule
SQL state: 0A000
Detail: rule _RETURN on view nome_da_view depends on column "nome_da_coluna"

Uma solução possível seria remover esta view com o comando DROP VIEW, rodar o comando ALTER TABLE, e depois recriar a view novamente.

Mas se o banco de dados possui vários objetos relacionados a este campo, isto se tornaria uma tarefa muito difícil.

Então uma solução seria alterar as características deste campo diretamente nas configurações do banco de dados.

Por exemplo, vamos ver o tamanho atual do campo que vamos atualizar:

SELECT atttypmod FROM pg_attribute
WHERE attrelid = 'nome_da_tabela'::regclass
AND attname = 'nome_da_coluna';

Se o tamanho deste campo é 255, o valor retornado será 259 (4 e adicionado por razoes de compatibilidade). Bem com o sucesso desta consulta, podemos realizar o seguinte update:

UPDATE pg_attribute SET atttypmod = 512+4
WHERE attrelid = 'nome_da_tabela'::regclass
AND attname = 'nome_da_coluna'; 

6 respostas para “Alterar tamanho de um campo em banco de dados PostgreSQL”.

  1. Avatar de Ery Maciel
    Ery Maciel

    da forma como está feito o update, vai alterar o tamanho de todos os campos da tabela e não somente da coluna desejada.. tem que colocar no WHERE o “AND attname = ‘nome_da_coluna’;”

    1. Avatar de diegosanches
      diegosanches

      Tem razão. Corrigido! Muito obrigado Ery.

  2. Avatar de Vitor Almeida
    Vitor Almeida

    Amigo, muuuuuuuito obrigado!!!
    Era exatamente isso que estava procurando!
    Estava tendo um trabalhão, iria ter que modificar umas 30 views.

    Obrigado 10000000x !!!!

    🙂

  3. Avatar de islaine
    islaine

    Obrigada, depois de encontrar n. respostas que só continuaram dando erro….enfim uma que realmente me ajudou. Obrigada Ery Maciel e Diego Sanches!

  4. Avatar de Leonardo
    Leonardo

    Mas a execução desse sql não atualiza o tamanho do campo numa view materializada, certo? no meu caso fiz a atualização do tamanho do campo usando este sql e funcionou para a tabela fisica no banco, porém a view materializada que referencia esta estrutura ficou desatualizada.

  5. Avatar de Emilio
    Emilio

    Muito obrigado ! ! ! Ajudou bastante !

Deixar mensagem para Ery Maciel Cancelar resposta

Eu sou o Diego

Bem vindo ao meu website. Sim, aqui falamos sobre technologia. Simplesmente simples, fazendo o que se deve fazer em uma vida saudável, fazer tudo aquilo que gosta.

Vamos conectar!