Wie kann ich eine Tabelle in einer SpatiaLite-Datenbank ordnungsgemäß umbenennen?

11

Räumliche Ebenen (Tabellen) in SpatiaLite enthalten verschiedene unterstützende Objekte und Metadaten, einschließlich Trigger, Indizes und Einträge in (mindestens) der geometry_columnsTabelle. Ich suche (vorzugsweise) eine GUI, die alle erforderlichen Änderungen auf einmal erledigt, oder eine (Fallback-) Dokumentation aller erforderlichen Änderungen, um die räumlichen Ebenen nicht zu beschädigen.

Tabellen haben:

  1. Eintrag in geometry_columns.f_table_name.
  2. Fünf benannte Trigger [prefix]_[table_name]_geometry, wobei das Präfix angibt, ob es sich um ein Transaktions-Rollback oder eine Indexaktualisierung handelt.
  3. Drei räumliche Indizes benannt idx_[table_name]_geometry[_suffix]

Ich habe dies in zwei Anwendungen versucht, QGIS DB Manager und SpatiaLite-GUI.

Der angezeigte QGIS DB Manager hat folgende Auswirkungen:

  1. Aktualisiert korrekt geometry_columnsmit neuem Tabellennamen
  2. Benennt Trigger nicht um. Die Triggerdefinition wurde teilweise geändert, sodass sie BEFORE [INSERT|UPDATE|DELETE]auf den neuen Tabellennamen verweist. Die Bedingung sucht jedoch weiterhin nach dem alten Namen in geometry_columns.
  3. Benennt räumliche Indizes nicht um. Ich bin mir nicht sicher, ob dies wichtig ist, da Trigger immer noch auf alte Indexnamen verweisen.

Wenn Sie in SpatiaLite-GUI Wartung → Tabelle umbenennen wählen, erhalten Sie nur den Stub einer SQL- ALTER TABLEAnweisung. Dies ist unkompliziertes SQL und macht sogar weniger als QGIS DB Manager. Wenn Sie den neuen Tabellennamen eingeben, wird die Tabelle umbenannt. Andere Effekte:

  1. Die Tabelle wird nicht umbenannt geometry_columns.f_table_name, was bedeutet, dass viele GIS die Tabelle nicht als räumliche Ebene sehen.
  2. Benennt Trigger nicht um. Die Triggerdefinition wurde teilweise geändert, sodass sie BEFORE [INSERT|UPDATE|DELETE]auf den neuen Tabellennamen verweist. Die Bedingung sucht jedoch weiterhin nach dem alten Namen in geometry_columns.
  3. Benennt räumliche Indizes nicht um. Ich bin mir nicht sicher, ob dies wichtig ist, da Trigger immer noch auf alte Indexnamen verweisen.

Beachten Sie, dass die Spatialite-GUI die Option bietet, eine Geometriespalte wiederherzustellen, die den richtigen Eintrag hinzufügt geometry_columns(Sie müssen jedoch SRID, Geometrietyp und Dimensionen angeben), einen räumlichen Index zu erstellen oder neu zu erstellen und Trigger wiederherzustellen, jedoch keine Von diesen Funktionen werden alte Tabellenzeilen, Trigger oder Indizes entfernt, was zu einer Datenbank mit viel (möglicherweise harmlosem, aber ärgerlichem) Schmutz führt.

Lee Hachadoorian
quelle
3
Ich denke, es besteht ein großer Bedarf an einem "Tabellen-Manager" zum Neuanordnen, Umbenennen, Löschen usw. von Feldern in SpatiaLite, wenn wir jemals Formdateien entfernen möchten. Aber aus unbekannten Gründen gibt es meines Wissens kein solches Tool, das uns dabei helfen würde. Wäre vielleicht ein gutes Projekt für eine Crowdfunding-Initiative!
Bernd V.
Welche Version von Spatialite-GUI hast du?
user30184
SpatiaLite-GUI 1.7.1.
Lee Hachadoorian

Antworten:

2

Sie müssen die Tabelle mit einem neuen Tabellennamen kopieren und die Spalten umbenennen, wenn Sie die Daten kopieren. Eine Tabellenmanagerfunktion wäre dafür ideal, wurde aber noch nicht für die GUI erstellt. Der folgende Link zeigt einige formale Informationen dazu mit Beispielcode in SQLite. SpatiaLite ist ein Teil von SQLite, daher ist die Codierung dieselbe. Viel Glück!

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

Julia
quelle
Beachten Sie, dass es bei der Frage um das Umbenennen von Tabellen und nicht um Spalten geht . Auf der verlinkten Seite wird die ALTER TABLEAussage erörtert , aber in der Frage wird bereits angesprochen, warum dies für eine räumliche Datenbank nicht geeignet ist.
Lee Hachadoorian
Nachdem ich dies unter Berücksichtigung Ihres Kommentars weiter untersucht habe, glaube ich nicht, dass es einen angemessenen Weg gibt, dies zu tun und die Auslöser und andere strukturelle Komponenten zu warten. Es scheint, als müssten Sie den Code neu schreiben oder beim Exportieren der Tabelle (wenn Sie dies vorhaben) einen anderen Namen im Datenbankmanager in QGIS verwenden.
Julia