SuperMiQi Ответов: 1

[Sqlite] логическая ошибка SQL при удалении таблицы перед удалением связанного представления


Всем Привет,

Надеюсь, что все вы живы и здоровы.

У меня есть любопытный вопрос, касающийся последовательности в SQL заявления с помощью SQLite.

У меня есть таблица [geometries] и табличное представление [FlagsGeometries].

Когда я делаю следующую последовательность действий:

1.
CREATE TABLE "newGeometries" ( columns definition)

2.
insert into newGeometries select * from Geometries

3.
drop table if exists Geometries

4.
alter table newGeometries rename to Geometries

Последний оператор генерирует исключение:
SQL logic error - error in view FlagsGeometries: no such table: main.Geometries


Этот пакет работает нормально на одном компьютере, но терпит неудачу на другом, используя тот же набор файлов sqlite версии.

Что я уже пробовал:

Чтобы решить эту проблему, я изменил код следующим образом:

1.
1. <pre> CREATE TABLE "newGeometries" ( columns definition) 

2.
insert into newGeometries select * from Geometries

2.5 ****
drop view if exists FlagsGeometries
****
3.
drop table if exists Geometries

4.
alter table newGeometries rename to Geometries

5.
**** 
CREATE VIEW [FlagsGeometries] AS select xxxxx from Geometries 
****

Эта модификация покроет проблему, но почему она не работает на всех компьютерах ?

Не стесняйтесь поделиться, если у вас есть объяснение.
Заранее Вам большое спасибо.
С уважением.
Мики

Richard MacCutchan

Все ли системы используют одну и ту же версию SQLite? С другой стороны, это может быть просто вопрос времени.

1 Ответов

Рейтинг:
2

OriginalGriff

Представление хранится в виде предварительно скомпилированной инструкции SQL, относящейся к определенному источнику таблицы - когда вы удалили его, этот источник больше не существует, и представление создает ошибку.

Чтобы удалить базовую таблицу, необходимо сначала удалить представление, удалить таблицу, воссоздать таблицу, а затем воссоздать представление.

Но зачем ты все это делаешь? Вы копируете все элементы старой таблицы в новую, так что в итоге получите ту же таблицу и, возможно, больший файл БД ...


SuperMiQi

Привет OriginalGriff,

Спасибо за ваш ответ. У меня сложилось впечатление, что это было сделано для воссоздания таблицы с возможными вновь добавленными столбцами, поскольку она начинается с фиктивной базы данных, но я не могу получить ответ, так как коллега вышел на пенсию, и проблема только недавно вышла.
Я сделал именно то, что вы описали, и это исправляет проблему, но мне было интересно, почему она работала счастливо в прошлом без этого предварительного удаления просмотра. Это просто чтобы быть уверенным, что я ничего не упущу.

Модификация звучит логично, но интересно, почему это не было введено в первую очередь.

Спасибо снова.
С уважением.
Мики