Comment renommer correctement une table dans une base de données SpatiaLite?

11

Les couches spatiales (tables) dans SpatiaLite incluent divers objets et métadonnées de support, y compris des déclencheurs, des index et des entrées (au minimum) dans la geometry_columnstable. Je recherche (de préférence) une interface graphique qui gérerait toutes les modifications nécessaires en une seule fois, ou une documentation (de secours) de toutes les modifications requises afin de ne pas casser les couches spatiales.

Les tableaux ont:

  1. Entrée dans geometry_columns.f_table_name.
  2. Cinq déclencheurs nommés [prefix]_[table_name]_geometry, où le préfixe indique s'il s'agit d'une restauration de transaction ou d'une mise à jour d'index.
  3. Trois indices spatiaux nommés idx_[table_name]_geometry[_suffix]

J'ai essayé cela dans deux applications, QGIS DB Manager et SpatiaLite-GUI.

QGIS DB Manager semble avoir les effets suivants:

  1. Mises à jour correctes geometry_columnsavec le nouveau nom de table
  2. Ne renomme pas les déclencheurs. La définition du déclencheur est partiellement modifiée afin de faire BEFORE [INSERT|UPDATE|DELETE]référence au nouveau nom de table, mais la condition recherche toujours l'ancien nom dans geometry_columns.
  3. Ne renomme pas les indices spatiaux. Je ne sais pas si cela est important car les déclencheurs se réfèrent toujours aux anciens noms d'index.

Lorsque vous choisissez Maintenance → Renommer la table dans SpatiaLite-GUI, vous obtenez simplement le talon d'une ALTER TABLEinstruction SQL . Il s'agit de SQL simple et fait encore moins que QGIS DB Manager. Si vous remplissez le nouveau nom de table, la table est renommée. Autres effets:

  1. Le tableau n'est pas renommé geometry_columns.f_table_name, ce qui signifie que de nombreux SIG ne verront pas le tableau comme une couche spatiale.
  2. Ne renomme pas les déclencheurs. La définition du déclencheur est partiellement modifiée afin de faire BEFORE [INSERT|UPDATE|DELETE]référence au nouveau nom de table, mais la condition recherche toujours l'ancien nom dans geometry_columns.
  3. Ne renomme pas les indices spatiaux. Je ne sais pas si cela est important car les déclencheurs se réfèrent toujours aux anciens noms d'index.

Notez que Spatialite-GUI donne la possibilité de récupérer une colonne de géométrie qui ajoute l'entrée correcte geometry_columns(mais vous oblige à spécifier le SRID, le type de géométrie et les dimensions), à construire ou à reconstruire un index spatial et à récupérer des déclencheurs, mais aucun de ces fonctions suppriment les anciennes lignes de table, les déclencheurs ou les index, conduisant à une base de données contenant beaucoup de schmutz (éventuellement inoffensifs mais ennuyeux).

Lee Hachadoorian
la source
3
Je pense qu'il y a un grand besoin d'un "gestionnaire de table" pour réorganiser, renommer, supprimer les champs etc. dans SpatiaLite si nous voulons nous débarrasser des fichiers de forme. Mais, pour des raisons inconnues, il n’existe aucun outil de ce type qui puisse nous aider à ce sujet, à ma connaissance. Ce serait peut-être un bon projet pour une initiative de financement participatif!
Bernd V.
Quelle version de spatialite-gui avez-vous?
user30184
SpatiaLite-GUI 1.7.1.
Lee Hachadoorian

Réponses:

2

Vous devez copier la table avec un nouveau nom de table et renommer les colonnes lorsque vous copiez les données. Une fonction de gestionnaire de table serait idéale pour cela, mais n'a pas encore été créée pour l'interface graphique. Le lien ci-dessous montre des informations formelles pour cela avec un exemple de code dans SQLite. SpatiaLite fait partie de SQLite donc le codage est le même. Bonne chance!

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

Julia
la source
Notez que la question concerne le changement de nom des tables , pas des colonnes . La page liée traite de l' ALTER TABLEénoncé, mais la question explique déjà pourquoi cela est inadéquat pour une base de données spatiale.
Lee Hachadoorian
Après avoir examiné cela plus en détail avec votre commentaire à l'esprit, je ne pense pas qu'il existe un moyen adéquat de le faire et de maintenir les déclencheurs et autres composants structurels. Il semblerait que vous auriez besoin de réécrire le code ou lorsque vous allez exporter la table (si vous prévoyez de le faire), utilisez un nom différent dans le gestionnaire de base de données dans QGIS.
Julia