Eu tenho um local VIEW
onde estou tentando criar um script de evolução para poder adicionar uma coluna a ele. Essa parte funciona bem; coluna adicionada muito bem. No entanto, o inverso não funciona; remova a última coluna adicionada falhará com uma ERROR: cannot drop columns from view
mensagem. O problema é que essa visão em particular tem muitas referências, de e para, portanto, não posso apenas DROP CASCADE
o que é danado!
Existe uma razão pela qual não consigo remover uma coluna recém-adicionada de uma determinada VIEW
? Então, o que posso fazer para realizar esta 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.)
fonte
ALTER VIEW ... ADD COLUMN
. Você está usandoCREATE OR REPLACE VIEW
? Mostre seu código, por favor.CREATE OR REPLACE VIEW
com a mesma definição, exceto uma coluna extra (porque uma tabela refinada possui uma nova coluna adicionada, portanto a visualização precisa incluí-la). A "devolução" remove a coluna da tabela refinada, portanto,VIEW
também não é mais necessário devolvê-la.Respostas:
O PostgreSQL (verdadeiro 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 pela qual o suporte para descartar colunas não possa ser adicionado, mas ninguém fez o trabalho necessário para implementá-lo ainda.
CREATE OR REPLACE VIEW
precisaria varrer recursivamente todas as dependências e garantir que nenhuma delas referenciasse a coluna a ser eliminada. Se eles usassemSELECT *
, teria que remover a coluna da expansão de*
na dependência e também varrer suas dependências. Há um bom trabalho envolvido nisso e há algumas áreas em que não está claro como exatamente a queda da coluna deve se comportar, principalmente quando se trata de interações com despejo e recarga. Portanto, ninguém queria o recurso suficiente para implementá-lo ainda. Patches e / ou patrocínio de desenvolvimento são bem-vindos.Você terá que abandonar a visualização e tudo o que depende dela, depois recrie-a e suas dependências. (O mesmo costumava ser verdadeiro para adicionar uma coluna a uma visualização; o suporte para adicionar colunas foi introduzido na 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ê soltar uma coluna e adicioná-la novamente, os dados ainda desaparecerão.
fonte