Como posso renomear corretamente uma tabela em um banco de dados SpatiaLite?

11

As camadas espaciais (tabelas) no SpatiaLite incluem vários objetos e metadados de suporte, incluindo gatilhos, índices e entradas (no mínimo) na geometry_columnstabela. 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:

  1. Entrada em geometry_columns.f_table_name.
  2. Cinco gatilhos nomeados [prefix]_[table_name]_geometry, em que prefixo indica se é uma reversão de transação ou atualização de índice.
  3. 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:

  1. Atualiza corretamente geometry_columnscom o novo nome da tabela
  2. 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 em geometry_columns.
  3. 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 TABLEinstruçã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:

  1. 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.
  2. 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 em geometry_columns.
  3. 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).

Lee Hachadoorian
fonte
3
Eu acho que existe uma grande necessidade de um "Table Manager" para reorganizar, renomear, excluir campos etc no SpatiaLite, se quisermos nos livrar dos arquivos de forma. Mas, por razões desconhecidas, não existe uma ferramenta que nos ajude com isso, até onde eu saiba. Seria talvez um bom projeto para uma iniciativa de financiamento coletivo!
Bernd V.
Qual versão do spatialite-gui você tem?
user30184
SpatiaLite-GUI 1.7.1.
Lee Hachadoorian

Respostas:

2

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/

Julia
fonte
Observe que a pergunta é sobre renomear tabelas , não colunas . A página vinculada discute a ALTER TABLEdeclaração, mas a pergunta já aborda por que isso é inadequado para um banco de dados espacial.
21817 Lee Hachadoorian
Depois de analisar isso mais a fundo com seu comentário em mente, não acho que exista uma maneira adequada de fazer isso e manter os gatilhos e outros componentes estruturais. Parece que você precisaria reescrever o código ou, quando exportar a tabela (se planeja fazê-lo), use um nome diferente no gerenciador de banco de dados no QGIS.
Julia