Eu tenho um VIEW
onde estou tentando criar um script de evolução, para que eu possa adicionar uma coluna a ele. Essa parte funciona bem; coluna adicionada muito bem. No entanto, o inverso não funciona; remover essa última coluna adicionada falha com uma ERROR: cannot drop columns from view
mensagem. O problema é que essa visão em particular tem muitas referências, tanto de quanto para, portanto, não posso apenas DROP CASCADE
a maldita coisa!
Existe uma razão pela qual não consigo remover uma coluna recém-adicionada de um determinado VIEW
? Então, o que posso fazer para realizar essa tarefa?
(Nota: as circunstâncias, aqui, são o que são, mas posso muito bem ver uma situação semelhante, também conhecida como descartar uma coluna de uma exibição, em muitos outros casos.)
PostgreSQL (true até pelo menos 9.4) atualmente não suporta a remoção de uma coluna com
CREATE OR REPLACE VIEW
.Não há nenhuma razão fundamental para que o suporte para eliminar colunas não possa ser adicionado, mas ninguém fez o trabalho necessário para implementá-lo ainda.
CREATE OR REPLACE VIEW
teria que escanear recursivamente todas as dependências e certificar-se de que nenhuma delas referenciasse a coluna a ser descartada. Se eles usassemSELECT *
, teria que remover a coluna da expansão da*
dependência e verificar suas dependências também. Há um pouco de trabalho envolvido em fazer isso, e há algumas áreas em que não está claro como exatamente a queda da coluna deve se comportar, especialmente quando se trata de interações com dump e recarregamento. Portanto, ninguém queria o recurso o suficiente para implementá-lo ainda. Patches e/ou patrocínio de desenvolvimento são bem-vindos.Você terá que descartar a visão e tudo o que depende dela e, em seguida, recriá-la e suas dependências. (O mesmo costumava ser verdade para adicionar uma coluna a uma exibição; o suporte para adicionar colunas foi introduzido na versão 8.4).
Observe que, em geral, não há expectativa de que o DDL seja reversível. O conceito de "devoluções" é realmente falho. Por exemplo, se você descartar uma coluna e adicioná-la novamente, os dados ainda desaparecerão.