As camadas espaciais (tabelas) no SpatiaLite incluem vários objetos e metadados de suporte, incluindo gatilhos, índices e entradas (no mínimo) na geometry_columns
tabela. Estou procurando (preferencialmente) uma GUI que lide com todas as alterações necessárias de uma só vez, ou documentação (substituta) de todas as alterações necessárias para não quebrar as camadas espaciais.
As tabelas têm:
- Entrada em
geometry_columns.f_table_name
. - Cinco gatilhos nomeados
[prefix]_[table_name]_geometry
, em que prefixo indica se é uma reversão de transação ou atualização de índice. - Três índices espaciais nomeados
idx_[table_name]_geometry[_suffix]
Eu tentei isso em dois aplicativos, QGIS DB Manager e SpatiaLite-GUI.
O QGIS DB Manager aparece com os seguintes efeitos:
- Atualiza corretamente
geometry_columns
com o novo nome da tabela - Não renomeia os gatilhos. A definição do acionador é parcialmente modificada para que
BEFORE [INSERT|UPDATE|DELETE]
se refira ao novo nome da tabela, mas a condição ainda procura pelo nome antigo emgeometry_columns
. - Não renomeia índices espaciais. Não tenho certeza se isso importa, porque os gatilhos ainda se referem a nomes de índices antigos.
Ao escolher Manutenção → Renomear tabela no SpatiaLite-GUI, você obtém o stub de uma ALTER TABLE
instrução SQL . Este é um SQL simples e faz ainda menos que o QGIS DB Manager. Se você preencher o novo nome da tabela, a tabela será renomeada. Outros efeitos:
- A tabela não é renomeada
geometry_columns.f_table_name
, o que significa que muitos GIS não verão a tabela como uma camada espacial. - Não renomeia os gatilhos. A definição do acionador é parcialmente modificada para que
BEFORE [INSERT|UPDATE|DELETE]
se refira ao novo nome da tabela, mas a condição ainda procura pelo nome antigo emgeometry_columns
. - Não renomeia índices espaciais. Não tenho certeza se isso importa, porque os gatilhos ainda se referem a nomes de índices antigos.
Observe que Spatialite-GUI oferece a opção de recuperar uma coluna de geometria que inclui a entrada correta geometry_columns
(mas requer que você especifique SRID, tipo de geometria e dimensões), crie ou reconstrua um índice espacial e recupere gatilhos, mas nenhum dessas funções removem linhas, gatilhos ou índices antigos da tabela, levando a um banco de dados com muitos schmutz (possivelmente inofensivos, mas irritantes).
fonte
Respostas:
Você precisa copiar a tabela com um novo nome de tabela e renomear as colunas ao copiar os dados. Uma função de gerenciador de tabelas seria ideal para isso, mas ainda não foi criada para a GUI. O link abaixo mostra algumas informações formais para isso com código de exemplo no SQLite. O SpatiaLite faz parte do SQLite, portanto a codificação é a mesma. Boa sorte!
https://blog.xojo.com/2013/12/04/renaming-columns-in-sqlite-tables/
fonte
ALTER TABLE
declaração, mas a pergunta já aborda por que isso é inadequado para um banco de dados espacial.