Temos vários esquemas de nomenclatura para colunas (como id
/ key
ou created
/ creation_date
/ create_date
) e queremos unificá-los.
Também queremos fazê-lo de forma compatível com versões anteriores . Queremos poder executar o código antigo junto com o novo até nos livrarmos do código antigo, seguindo:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
é uma mudança de ruptura.
Existe alguma forma de alias para colunas como visualizações para tabelas (para Postgresql)?
RESPOSTA @CL (tnx para dica!) https://www.postgresql.org/docs/12/ddl-generated-columns.html
Uma coluna gerada não pode ser gravada diretamente. Nos comandos INSERT ou UPDATE, um valor não pode ser especificado para uma coluna gerada, mas a palavra-chave DEFAULT pode ser especificada.
Portanto, se uma ideia é manter colunas até atualizar todo o script de relatório - tudo bem. Mas se você quiser uma reversão para a versão anterior do aplicativo - você está sem sorte ((
Atualmente, estamos na oferta do Google Postgres Cloud: https://cloud.google.com/sql/docs/postgres/db-versions e a v12 está apenas na versão beta.
Não há uma maneira fácil de fazer isso, mas a única maneira que consigo pensar é usar uma camada de visualizações para manter os nomes antigos.
Crie dois esquemas, por exemplo, "antigo" e "novo" ou algo parecido.
O esquema "novo" contém as tabelas reais com os novos nomes de coluna (e talvez tabela). Tenha aplicativos que possam lidar com isso defina o search_path apenas para o novo esquema.
Para cada tabela que renomeou colunas (ou se a própria tabela foi renomeada), crie uma visão no esquema "antigo" com os nomes antigos, por exemplo
Esta visão será automaticamente atualizável sem a necessidade de escrever gatilhos para ela.
Faça com que os aplicativos que podem lidar apenas com os nomes antigos definam search_path como
old, new
. Uma referência não qualificada atable_name
usará a exibiçãoold.table_name
com as colunas que o código espera. Como a visualização é atualizável, isso também funcionará para DML.Obviamente, isso não funcionará se o código do aplicativo verificar a presença de tabelas reais por algum motivo. Ou tenta detectar restrições para essas tabelas.
Também requer que você possa alterar o caminho de pesquisa ao se conectar ao banco de dados (por exemplo, ao usar JDBC, você pode conseguir isso passando-o na URL de conexão)