Пространственные слои (таблицы) в SpatiaLite включают в себя различные вспомогательные объекты и метаданные, включая триггеры, индексы и записи в (как минимум) geometry_columns
таблице. Я ищу (предпочтительно) графический интерфейс, который бы обрабатывал все необходимые изменения за один раз, или (откат) документации всех необходимых изменений, чтобы не нарушать пространственные слои.
Таблицы имеют:
- Вход в
geometry_columns.f_table_name
. - Пять названных триггеров
[prefix]_[table_name]_geometry
, где префикс указывает, является ли это откатом транзакции или обновлением индекса. - Три пространственных индекса названы
idx_[table_name]_geometry[_suffix]
Я пробовал это в двух приложениях, QGIS DB Manager и SpatiaLite-GUI.
Диспетчер БД QGIS имеет следующие эффекты:
- Корректно обновляется
geometry_columns
с новым именем таблицы - Не переименовывает триггеры. Определение триггера частично изменено, так что оно
BEFORE [INSERT|UPDATE|DELETE]
ссылается на новое имя таблицы, но условие все еще ищет старое имя вgeometry_columns
. - Не переименовывает пространственные показатели. Не уверен, что это имеет значение, потому что триггеры все еще ссылаются на старые имена индексов.
Когда вы выбираете Обслуживание → Переименовать таблицу в SpatiaLite-GUI, вы просто получаете заглушку оператора SQL ALTER TABLE
. Это простой SQL и делает даже меньше, чем QGIS DB Manager. Если вы заполните новое имя таблицы, таблица будет переименована. Другие эффекты:
- Таблица вовсе не переименовываются в
geometry_columns.f_table_name
, что означает , что многие GISes не будут видеть таблицу в качестве пространственного слоя. - Не переименовывает триггеры. Определение триггера частично изменено, так что оно
BEFORE [INSERT|UPDATE|DELETE]
ссылается на новое имя таблицы, но условие все еще ищет старое имя вgeometry_columns
. - Не переименовывает пространственные показатели. Не уверен, что это имеет значение, потому что триггеры все еще ссылаются на старые имена индексов.
Обратите внимание, что Spatialite-GUI дает возможность восстановить столбец геометрии, который добавляет правильную запись geometry_columns
(но требует указания SRID, типа геометрии и размеров), построить или перестроить пространственный индекс и восстановить триггеры, но ни один из этих функций удаляются старые строки таблицы, триггеры или индексы, что приводит к созданию БД с большим количеством (возможно, безвредных, но раздражающих) ошибок.
источник
Ответы:
Вам необходимо скопировать таблицу с новым именем таблицы и переименовать столбцы при копировании данных. Функция диспетчера таблиц была бы идеальной для этого, но еще не была создана для графического интерфейса. Ссылка ниже показывает некоторую формальную информацию для этого с примером кода в SQLite. SpatiaLite является частью SQLite, поэтому кодирование такое же. Удачи!
https://blog.xojo.com/2013/12/04/renaming-columns-in-sqlite-tables/
источник
ALTER TABLE
утверждение, но уже задается вопрос, почему этого недостаточно для пространственной базы данных.