Come posso rinominare correttamente una tabella in un DB SpatiaLite?


11

I livelli spaziali (tabelle) in SpatiaLite includono vari oggetti e metadati di supporto, inclusi trigger, indici e voci (almeno) nella geometry_columnstabella. Sto cercando (preferibilmente) una GUI che gestisca tutte le modifiche necessarie in una volta sola, o (fallback) la documentazione di tutte le modifiche necessarie in modo da non rompere gli strati spaziali.

Le tabelle hanno:

  1. Entrata geometry_columns.f_table_name.
  2. Cinque trigger denominati [prefix]_[table_name]_geometry, dove prefisso indica se si tratta di un rollback della transazione o di un aggiornamento dell'indice.
  3. Tre indici spaziali nominati idx_[table_name]_geometry[_suffix]

Ho provato questo in due applicazioni, QGIS DB Manager e SpatiaLite-GUI.

QGIS DB Manager appare ha i seguenti effetti:

  1. Si aggiorna correttamente geometry_columnscon il nuovo nome della tabella
  2. Non rinomina i trigger. La definizione del trigger viene parzialmente modificata in modo che faccia BEFORE [INSERT|UPDATE|DELETE]riferimento al nome della nuova tabella, ma la condizione cerca ancora il vecchio nome in geometry_columns.
  3. Non rinomina gli indici spaziali. Non sono sicuro se questo è importante perché i trigger fanno ancora riferimento ai vecchi nomi di indice.

Quando si sceglie Manutenzione → Rinomina tabella in SpatiaLite-GUI, si ottiene semplicemente lo stub di ALTER TABLEun'istruzione SQL . Questo è semplice SQL e fa anche meno di QGIS DB Manager. Se si inserisce il nome della nuova tabella, la tabella viene rinominata. Altri effetti:

  1. La tabella non viene rinominata geometry_columns.f_table_name, il che significa che molti GIS non vedranno la tabella come un livello spaziale.
  2. Non rinomina i trigger. La definizione del trigger viene parzialmente modificata in modo che faccia BEFORE [INSERT|UPDATE|DELETE]riferimento al nome della nuova tabella, ma la condizione cerca ancora il vecchio nome in geometry_columns.
  3. Non rinomina gli indici spaziali. Non sono sicuro se questo è importante perché i trigger fanno ancora riferimento ai vecchi nomi di indice.

Si noti che Spatialite-GUI offre l'opzione per ripristinare una colonna geometrica che aggiunge la voce corretta a geometry_columns(ma richiede di specificare SRID, tipo di geometria e dimensioni), per costruire o ricostruire un indice spaziale e per ripristinare i trigger, ma nessuno di queste funzioni rimuovono vecchie righe di tabella, trigger o indici, portando a un DB con un sacco di schmutz (probabilmente innocuo ma fastidioso).


3
Penso che ci sia una grande necessità di un "Gestore tabelle" per riorganizzare, rinominare, eliminare campi ecc. In SpatiaLite se vogliamo mai eliminare i file di forma. Ma, per ragioni sconosciute, non esiste uno strumento del genere che ci possa aiutare in questo, per quanto ne so. Sarebbe forse un buon progetto per un'iniziativa di crowdfunding!
Bernd V.

Quale versione di spatialite-gui hai?
user30184

SpatiaLite-GUI 1.7.1.
Lee Hachadoorian,

Risposte:


2

È necessario copiare la tabella con un nuovo nome di tabella e rinominare le colonne quando si copiano i dati. Una funzione di gestione tabelle sarebbe l'ideale per questo, ma non è stata ancora creata per la GUI. Il link seguente mostra alcune informazioni formali per questo con codice di esempio in SQLite. SpatiaLite fa parte di SQLite, quindi la codifica è la stessa. In bocca al lupo!

https://blog.xojo.com/2013/12/04/renaming-columns-in-sqlite-tables/


Si noti che la domanda riguarda la ridenominazione delle tabelle , non delle colonne . La pagina collegata discute l' ALTER TABLEaffermazione, ma la domanda affronta già perché questo non è adeguato per un database spaziale.
Lee Hachadoorian,

Dopo aver esaminato ulteriormente questo aspetto tenendo presente il tuo commento, non penso che ci sia un modo adeguato per farlo e mantenere i trigger e altri componenti strutturali. Sembrerebbe che dovresti riscrivere il codice o quando esporti la tabella (se hai intenzione di farlo), usa un nome diverso nel gestore db in QGIS.
Julia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.