Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Миграция с IB на FB. Опыт / 25 сообщений из 36, страница 1 из 2
17.06.2020, 14:31
    #39970206
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Наконец мы уговорили заказчика мигрировать с 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 строка
Код: sql
1.
2.
3.
4.
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 такой запрос
Код: sql
1.
SELECT * FROM mytable t ORDER BY mytable.fld

работал. В FB нужно писать строго
Код: sql
1.
SELECT * FROM mytable t ORDER BY е.fld



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

С уважением, Vasilisk
...
Рейтинг: 0 / 0
17.06.2020, 14:39
    #39970211
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
_Vasilisk_1.1 В IB максимальная длина идентификатора 67 символов. В FB 31. Пришлось часть объектов переименовать

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

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

IBX можно легко поправить для поддержки BOOLEAN в Firebird
...
Рейтинг: 0 / 0
17.06.2020, 14:45
    #39970215
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Симонов ДенисIBX можно легко поправить для поддержки BOOLEAN в Firebird

Не совсем. Там подколка не столько в номере типа, сколько в его размере. Легко не обратить
внимание и получить порчу памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.06.2020, 15:06
    #39970226
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Парни, кстати, прошу привести минимальный патч IBX для поддержки BOOLEAN-полей.
А то сквозь годы и сам по разным поводам его патчил, но вот на предмет именно этого руки так и не дошли.))
...
Рейтинг: 0 / 0
17.06.2020, 15:07
    #39970227
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Dimitry Sibiryakov
Легко не обратить внимание и получить порчу памяти.
Я в одном месте именно так промахнулся. Самое интересное, что при этом я получал Out of memory. FastMM на вызов ReallocMemory по поврежденному указателю возвращал nil, а Delphi считала, что закончилась память
...
Рейтинг: 0 / 0
17.06.2020, 15:12
    #39970230
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Vlad F
Парни, кстати, прошу привести минимальный патч IBX для поддержки BOOLEAN-полей.
Там все сильно зависит от версии IBX.

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


2. А потом ищешь все упоминания SQL_BOOLEAN и добавляешь рядом SQL_BOOLEAN_FB с учетом того, что SQL_BOOLEAN это два байта, а SQL_BOOLEAN_FB - один
...
Рейтинг: 0 / 0
17.06.2020, 15:22
    #39970237
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
_Vasilisk_IB такой запрос
SELECT * FROM mytable t ORDER BY mytable.fld
киянкой по пальцам за такой запрос. Независимо от того, выполнялся он или нет.
...
Рейтинг: 0 / 0
17.06.2020, 15:23
    #39970238
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
_Vasilisk_,

Если конкретно, то хотелось бы для той что в составе D 10.3.3 (CE).
P.S. Прошу не счесть за наглость, но м.б. у кого-то уже есть для нее готовое\проверенное (в ответ могу поделиться чем-нибудь своим)).
P.P.S. В любом случае за совет спасибо.
...
Рейтинг: 0 / 0
17.06.2020, 15:28
    #39970241
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
kdv
киянкой по пальцам за такой запрос
Не спорю. Формировался он динамически на основании TField.FullName. А код писался лет 15 назад
...
Рейтинг: 0 / 0
18.06.2020, 11:53
    #39970479
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
kdv
_Vasilisk_IB такой запрос
SELECT * FROM mytable t ORDER BY mytable.fld

киянкой по пальцам за такой запрос. Независимо от того, выполнялся он или нет.
А за что именно? За игнорирование алиаса в ORDER BY?
...
Рейтинг: 0 / 0
18.06.2020, 11:54
    #39970480
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
alekcvp,

за комбинирование - алиас у таблицы указан, а у столбца вместо алиаса имя таблицы написано. Либо одно, либо другое, а сразу оба - не надо.
...
Рейтинг: 0 / 0
18.06.2020, 12:11
    #39970487
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
alekcvp,

заодно и за "select *".
...
Рейтинг: 0 / 0
18.06.2020, 13:30
    #39970505
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
kdv
а сразу оба - не надо.

Так FB и не даст, начиная с какой-то версии.
...
Рейтинг: 0 / 0
18.06.2020, 13:47
    #39970511
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
KreatorXXI
alekcvp,
заодно и за "select *".

А что плохого в 'select * ', если это мелкий справочник какой-то?
...
Рейтинг: 0 / 0
18.06.2020, 13:54
    #39970517
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
alekcvp,

если ты железно уверен что состав и порядок полей в таблице никогда не изменится, то может и ничего.
...
Рейтинг: 0 / 0
18.06.2020, 13:58
    #39970518
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
alekcvp
KreatorXXI
alekcvp,
заодно и за "select *".

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

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

Код: sql
1.
2.
select * from rdb$relations
order by 9


Код: sql
1.
2.
select * from rdb$relations
order by rdb$relation_name


Код: sql
1.
2.
select rdb$description, rdb$relation_name from rdb$relations 
order by rdb$relation_name


Код: sql
1.
2.
select rdb$description, rdb$relation_name from rdb$relations 
order by 2



- ?
...
Рейтинг: 0 / 0
18.06.2020, 14:00
    #39970521
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
alekcvp,

на клиенте могут быть проблемы. Как сказал Симонов Денис, порядок и состав полей могут на клиенте не совпадать с сервером. По хорошему, клиент знает только то, что ему разрешили знать. А селектом со звёздочкой Вы ломаете эти знания.
...
Рейтинг: 0 / 0
18.06.2020, 14:03
    #39970522
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Селект со звездочкой нужен, чтобы быстро посмотреть, когда руками в базе копаешься.
...
Рейтинг: 0 / 0
18.06.2020, 14:05
    #39970523
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
ъъъъъ,

и ещё в EXISTS(SELECT * ...)
...
Рейтинг: 0 / 0
18.06.2020, 14:11
    #39970527
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Симонов Денис,

я раньше "нафсякий" писал
Код: sql
1.
exists(select first 1 1 from...)
...
Рейтинг: 0 / 0
18.06.2020, 14:25
    #39970531
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Помнится, Kdv мне тоже вставлял за * ))
Но мир все-таки не черно-белый. Иногда можно. Главное понимать, что и как.
...
Рейтинг: 0 / 0
18.06.2020, 14:39
    #39970536
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Barmaley57,

звёздочка и есть чёрно-белый мир! Звёздочка в клиентском приложении. Вы представьте себе - банальная перестановка полей на сервере приводит к краху работы огромного программного комплекса.
...
Рейтинг: 0 / 0
18.06.2020, 14:41
    #39970537
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
Осталось найти идиота-самоубийцу, чтобы он поменял местами поля в базе, обслуживающей
огромный программный комплекс.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.06.2020, 15:33
    #39970556
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
KreatorXXI
заодно и за "select *".
Капец, сколько обсуждений из-за одного примера запроса, который иллюстрирует совершенно другую проблему
Dimitry Sibiryakov
Осталось найти идиота-самоубийцу, чтобы он поменял местами поля в базе, обслуживающей огромный программный комплекс.
А здесь в чем проблема? Или есть такие идиоты, которые вначале пишут SELECT *, а потом лезут к датасету по номеру поля?
...
Рейтинг: 0 / 0
18.06.2020, 15:50
    #39970561
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция с IB на FB. Опыт
KreatorXXI
Вы представьте себе - банальная перестановка полей на сервере приводит к краху работы огромного программного комплекса.
Представить, конечно, можно. С трудом.
У меня есть тема с точностью до наоборот: изменение порядка полей в базе меняет их расположение в таблицах и формах на клиенте. И даже звездочка спокойно прокатывает.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Миграция с IB на FB. Опыт / 25 сообщений из 36, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]