Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Миграция с IB на FB. Опыт  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
Наконец мы уговорили заказчика мигрировать с Interbase на Firebird. Тут расскажу о выявленных подводных камнях.

Переходили мы с IB 2017 (хотя реально база разрабатывалась на 2009) на FB3.0

1. Сама миграция базы.
По классике нужно слить в SQL скрипт метаданные и данные (это замечательно делает IBExpert) и загрузить их в новую базу.
Вероятные проблемы:
1.1 В IB максимальная длина идентификатора 67 символов. В FB 31. Пришлось часть объектов переименовать
1.2 В FB модификация данных системных таблиц запрещена. В частности у меня обломился хак с динамическим текстом исключения. Но в FB добавили штатную функциональность для этого
1.3 Вместо таблиц TMP$ нужно обращаться к MON$
1.4 При значительном объеме данных залить их в новую базу не просто. Подробности и способы увеличения скорости здесь

2. Далее, самый большой пакет проблем я отгреб с BOOLEAN
2.1 IBX (проект пока на нем) не поддерживает тип Firebird BOOLEAN. Пришлось вручную допиливать эти компоненты. У FireDac проблем с этим типом нет, но проект на IBX
2.2 В IB можно было делать свободный каст между BOOLEAN и SMALLINT. В FB строка
DECLARE VARIABLE var_bool BOOLEAN;
BEGIN
  var_bool = 1;
END
приводит к ошибке конвертации типов. Причем не компиляции, а выполнения. Поэтому все процедуры и триггеры нужно очень внимательно прошерстить на этот предмет.

3. Сортировка
3.1 В IB нет конструкции NULLS FIRST | LAST. А все NULL значения помещались в конец выборки. В FB если явно не указал NULLS LAST получишь NULL в начале выборки
3.2 IB позволяла указывать полное название таблицы в имени сортируемого поля, даже если таблице присваивался алиас. Т.е. в IB такой запрос
SELECT * FROM mytable t ORDER BY mytable.fld
работал. В FB нужно писать строго
SELECT * FROM mytable t ORDER BY е.fld


В целом переход получился безболезненным и довольно простым.

С уважением, Vasilisk
17 июн 20, 14:31    [22152391]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
_Vasilisk_
1.1 В IB максимальная длина идентификатора 67 символов. В FB 31. Пришлось часть объектов переименовать


ну это только в 4.0 расширено до 63 символов. Причём в FB честные символы. В IB скорее всего не символы, а байты.

_Vasilisk_
2.1 IBX (проект пока на нем) не поддерживает тип Firebird BOOLEAN. Пришлось вручную допиливать эти компоненты. У FireDac проблем с этим типом нет, но проект на IBX


IBX можно легко поправить для поддержки BOOLEAN в Firebird
17 июн 20, 14:39    [22152399]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

Симонов Денис
IBX можно легко поправить для поддержки BOOLEAN в Firebird

Не совсем. Там подколка не столько в номере типа, сколько в его размере. Легко не обратить
внимание и получить порчу памяти.

Posted via ActualForum NNTP Server 1.5

17 июн 20, 14:45    [22152405]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Vlad F
Member

Откуда:
Сообщений: 1295
Парни, кстати, прошу привести минимальный патч IBX для поддержки BOOLEAN-полей.
А то сквозь годы и сам по разным поводам его патчил, но вот на предмет именно этого руки так и не дошли.))
17 июн 20, 15:06    [22152429]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
Dimitry Sibiryakov
Легко не обратить внимание и получить порчу памяти.
Я в одном месте именно так промахнулся. Самое интересное, что при этом я получал Out of memory. FastMM на вызов ReallocMemory по поврежденному указателю возвращал nil, а Delphi считала, что закончилась память
17 июн 20, 15:07    [22152430]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
Vlad F
Парни, кстати, прошу привести минимальный патч IBX для поддержки BOOLEAN-полей.
Там все сильно зависит от версии IBX.

Общий алгоритм такой:
1. В IBHeader объявляешь
SQL_BOOLEAN_FB                 =        32764;

2. А потом ищешь все упоминания SQL_BOOLEAN и добавляешь рядом SQL_BOOLEAN_FB с учетом того, что SQL_BOOLEAN это два байта, а SQL_BOOLEAN_FB - один
17 июн 20, 15:12    [22152433]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
_Vasilisk_
IB такой запрос
SELECT * FROM mytable t ORDER BY mytable.fld

киянкой по пальцам за такой запрос. Независимо от того, выполнялся он или нет.
17 июн 20, 15:22    [22152442]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Vlad F
Member

Откуда:
Сообщений: 1295
_Vasilisk_,

Если конкретно, то хотелось бы для той что в составе D 10.3.3 (CE).
P.S. Прошу не счесть за наглость, но м.б. у кого-то уже есть для нее готовое\проверенное (в ответ могу поделиться чем-нибудь своим)).
P.P.S. В любом случае за совет спасибо.

Сообщение было отредактировано: 17 июн 20, 15:22
17 июн 20, 15:23    [22152443]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
kdv
киянкой по пальцам за такой запрос
Не спорю. Формировался он динамически на основании TField.FullName. А код писался лет 15 назад
17 июн 20, 15:28    [22152447]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
kdv
_Vasilisk_
IB такой запрос
SELECT * FROM mytable t ORDER BY mytable.fld

киянкой по пальцам за такой запрос. Независимо от того, выполнялся он или нет.

А за что именно? За игнорирование алиаса в ORDER BY?
18 июн 20, 11:53    [22152859]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
alekcvp,

за комбинирование - алиас у таблицы указан, а у столбца вместо алиаса имя таблицы написано. Либо одно, либо другое, а сразу оба - не надо.
18 июн 20, 11:54    [22152862]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 981
alekcvp,

заодно и за "select *".
18 июн 20, 12:11    [22152878]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
kdv
а сразу оба - не надо.

Так FB и не даст, начиная с какой-то версии.
18 июн 20, 13:30    [22152914]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
KreatorXXI
alekcvp,
заодно и за "select *".

А что плохого в 'select * ', если это мелкий справочник какой-то?
18 июн 20, 13:47    [22152922]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
alekcvp,

если ты железно уверен что состав и порядок полей в таблице никогда не изменится, то может и ничего.
18 июн 20, 13:54    [22152931]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
alekcvp
KreatorXXI
alekcvp,
заодно и за "select *".

А что плохого в 'select * ', если это мелкий справочник какой-то?

При чем тут размер?
1. Вставил новое поле, изменил порядок полей - лови глюки. Например, там, где ссылка к полю по номеру.
2. Добавил новое поле - и оно сразу в выборке, даже тогда, когда оно не нужно.
3. Не видно нибуя, что хотел сказать афтар.
Пример: нужны описания реляций, в порядке названий. Какое из предложений более пригодно для глаза кодера:

select * from rdb$relations
order by 9

select * from rdb$relations
order by rdb$relation_name

select rdb$description, rdb$relation_name from rdb$relations 
order by rdb$relation_name

select rdb$description, rdb$relation_name from rdb$relations 
order by 2


- ?
18 июн 20, 13:58    [22152934]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 981
alekcvp,

на клиенте могут быть проблемы. Как сказал Симонов Денис, порядок и состав полей могут на клиенте не совпадать с сервером. По хорошему, клиент знает только то, что ему разрешили знать. А селектом со звёздочкой Вы ломаете эти знания.
18 июн 20, 14:00    [22152937]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
Селект со звездочкой нужен, чтобы быстро посмотреть, когда руками в базе копаешься.
18 июн 20, 14:03    [22152940]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
ъъъъъ,

и ещё в EXISTS(SELECT * ...)
18 июн 20, 14:05    [22152944]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
Симонов Денис,

я раньше "нафсякий" писал
exists(select first 1 1 from...)
18 июн 20, 14:11    [22152950]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5745
Помнится, Kdv мне тоже вставлял за * ))
Но мир все-таки не черно-белый. Иногда можно. Главное понимать, что и как.
18 июн 20, 14:25    [22152957]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 981
Barmaley57,

звёздочка и есть чёрно-белый мир! Звёздочка в клиентском приложении. Вы представьте себе - банальная перестановка полей на сервере приводит к краху работы огромного программного комплекса.
18 июн 20, 14:39    [22152963]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50343

Осталось найти идиота-самоубийцу, чтобы он поменял местами поля в базе, обслуживающей
огромный программный комплекс.

Posted via ActualForum NNTP Server 1.5

18 июн 20, 14:41    [22152965]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
KreatorXXI
заодно и за "select *".
Капец, сколько обсуждений из-за одного примера запроса, который иллюстрирует совершенно другую проблему
Dimitry Sibiryakov
Осталось найти идиота-самоубийцу, чтобы он поменял местами поля в базе, обслуживающей огромный программный комплекс.
А здесь в чем проблема? Или есть такие идиоты, которые вначале пишут SELECT *, а потом лезут к датасету по номеру поля?
18 июн 20, 15:33    [22152998]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5745
KreatorXXI
Вы представьте себе - банальная перестановка полей на сервере приводит к краху работы огромного программного комплекса.
Представить, конечно, можно. С трудом.
У меня есть тема с точностью до наоборот: изменение порядка полей в базе меняет их расположение в таблицах и формах на клиенте. И даже звездочка спокойно прокатывает.
18 июн 20, 15:50    [22153011]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить