Скромное очарование SQLite
2012-01-27 08:48 pmСЯУ, что sqlite обладает двумя совершенно очаровательными "фичами":
1)Когда ты бэкапишь базу, "CREATE VIEW" выписываются в порядке, в котором они создавались.
Казалось бы - ну и что? Теперь представим, что у тебя была вот такая база:
Затем вью b немного изменили:
(отдельный вопрос, почему это проходит без ругани, но такое поведение более-менее неплохо документировано)
Если теперь сделать ".dump", то сначала будет выписано "CREATE TABLE a", потом - "CREATE VIEW c", потом - "CREATE VIEW b". Естественно, "create view c" обломается, так как "b" еще не существует. Единственное лечение - пересоздать все view в "правильном порядке".
2)Если у тебя есть вью, описание которого оканчивается комментарием, то в бэкап это попадет вот таким образом:
Видите точку с запятой в конце описания commented_view? А вот sqlite ее не видит, так как она ... Правильно, является теперь частью комментария!
Все это выяснилось в процессе поднятия из бэкапа столетней давности некий софт в условиях ... эээ ... жестких временных ограничений. Помнится,
thesz давеча писал, что у sqlite на 1 строку кода приходится 100 строк тестов.
(принимая позу Станиславского) "Не верю!"
Если кому надо: раз багрепорт, два багрепорт.
1)Когда ты бэкапишь базу, "CREATE VIEW" выписываются в порядке, в котором они создавались.
Казалось бы - ну и что? Теперь представим, что у тебя была вот такая база:
create table a (int aa); create view b as select * from a; create view c as select * from b;
Затем вью b немного изменили:
begin; drop view b; create view b as select * from a where aa < 10; commit;
(отдельный вопрос, почему это проходит без ругани, но такое поведение более-менее неплохо документировано)
Если теперь сделать ".dump", то сначала будет выписано "CREATE TABLE a", потом - "CREATE VIEW c", потом - "CREATE VIEW b". Естественно, "create view c" обломается, так как "b" еще не существует. Единственное лечение - пересоздать все view в "правильном порядке".
2)Если у тебя есть вью, описание которого оканчивается комментарием, то в бэкап это попадет вот таким образом:
create view commented_view
as select something
from some_table -- pretty useless view;
create view another_view as ....
Видите точку с запятой в конце описания commented_view? А вот sqlite ее не видит, так как она ... Правильно, является теперь частью комментария!
Все это выяснилось в процессе поднятия из бэкапа столетней давности некий софт в условиях ... эээ ... жестких временных ограничений. Помнится,
(принимая позу Станиславского) "Не верю!"
Если кому надо: раз багрепорт, два багрепорт.
(no subject)
Date: 2012-01-27 09:07 pm (UTC)(no subject)
Date: 2012-01-27 09:12 pm (UTC)(no subject)
Date: 2012-01-27 09:28 pm (UTC)(no subject)
Date: 2012-01-28 03:15 pm (UTC)col varchar2(100) -- bla-bla
сохраняет комментарий вместе с типом столбца в метаданных.
(no subject)
Date: 2012-01-28 03:20 pm (UTC)"Имя, сестра, имя!"
(no subject)
Date: 2012-01-27 09:27 pm (UTC)(no subject)
Date: 2012-01-27 09:31 pm (UTC)(no subject)
Date: 2012-01-27 09:43 pm (UTC)(no subject)
Date: 2012-01-27 09:47 pm (UTC)(no subject)
Date: 2012-01-28 02:03 pm (UTC)(no subject)
Date: 2012-01-27 09:44 pm (UTC)(no subject)
Date: 2012-01-27 11:49 pm (UTC)(no subject)
Date: 2012-01-28 12:31 am (UTC)(no subject)
Date: 2012-01-28 10:46 am (UTC)(no subject)
Date: 2012-01-28 11:19 am (UTC)(no subject)
Date: 2012-01-28 02:32 pm (UTC)(no subject)
Date: 2012-01-28 09:11 pm (UTC)Ваш пример очень нагляден, но есть ещё масса других ситуаций, в которых такое происходит. Например, constraints и triggers.
Правильный способ хранения схемы, безотносительно СУБД, - это скриптование от самого начала до текущей версии.
Следовательно, в первом примере view b должно было создаваться дважды: в первый раз - для версии 1, второй раз - для версии 2.
(no subject)
Date: 2012-01-31 10:49 pm (UTC)точный синтакс не помню, но примерно так.
create table aaa (int bbb);
....прошла пара месяцев и захотелось красивостей
create function xxx(int bbb): varchar(20) module 'xxx.dll' name 'xxx';
alter table aaa add (bbb_4human computed by (xxx(aaa)) )
.... все хорошо работало, пока не понадобилось развернуть бэкап
..restoring tables
aaa - failed: .....
..restoring user-defined functions
finishing, closing, going home.
минус одна таблица.