Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Миграция с 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]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
_Vasilisk_
Капец, сколько обсуждений из-за одного примера запроса, который иллюстрирует совершенно другую проблему

Ну привет. А традиции?
18 июн 20, 16:15    [22153033]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Коваленко Дмитрий
Member

Откуда: Липецк
Сообщений: 571
_Vasilisk_
[Или есть такие идиоты, которые вначале пишут SELECT *, а потом лезут к датасету по номеру поля?


Ну зачем так грубо - "идиоты"?

Это одна из технологий разработки ПО.

Называется "я вам, суки, помодифицирую".

Лично встречал такое (запросы со звёздочками и обращение по индексам)19 лет назад, переписывая один "крупный программный комплекс".

Сообщение было отредактировано: 19 июн 20, 08:06
19 июн 20, 08:05    [22153359]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
ъъъъъ
При чем тут размер?
1. Вставил новое поле, изменил порядок полей - лови глюки. Например, там, где ссылка к полю по номеру.
А обращение к полю по номеру - это, типа, best practics?.. Поменял потом сам что-то в запросе - и лови глюки?
19 июн 20, 10:52    [22153476]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
alekcvp
ъъъъъ
При чем тут размер?
1. Вставил новое поле, изменил порядок полей - лови глюки. Например, там, где ссылка к полю по номеру.
А обращение к полю по номеру - это, типа, best practics?.. Поменял потом сам что-то в запросе - и лови глюки?

Накосячить можно что угодно, хоть "silekt" вместо "select" написать - будет видно лишь в рантайме.

Обращении к полю по номеру, возможно, иногда не очень наглядно (а иногда - наоборот), но все равно, имея явно заданный список полей, видно, к какому полю обращаешься.
А с формой "select *" - уже ничего не видно. Ни номеров полей, ни их имён.
19 июн 20, 11:49    [22153528]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1394
Сегодня пятница, сегодня можно

для отчетов практически всегда пишу Select *
ибо указывать каждое поле в запросе мне просто лень
машина железная пусть разбирается
и никаких неудобств при этом не испытываю
19 июн 20, 12:37    [22153577]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
Симонов Денис
Member

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

да ну на фиг, из запроса к одной процедуре ещё можно, но из многотабличного запроса бррр

create table t1 (
  id int,
  name varchar(30)
);

create table t2 (
  id int,
  id_t1 int,
  name varchar(20)
);

select * from t1 join t2 on t2.id_t1 = t1.id


какие имена даст такой запрос?
19 июн 20, 12:44    [22153584]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1394
Симонов Денис,

Нет у меня таких запросов
есть Select * from Rpt....(:p1,:p2,.....)

А по поводу "да ну на фиг"
я боюсь даже представить что скажешь на вот это
"все это (запрос, и прочая требуха для отчета включая и описание диалога для запроса входных параметров)
пишется напрямую в DFM-ку без всякого редактора DFM"
используя самый ленивый способ тобишь COPY-PASTE

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

Откуда: Украина, Харьков
Сообщений: 11911
Симонов Денис
из запроса к одной процедуре ещё можно,
У нас когда-то написали
SELECT * FROM mytable
а потом долго удивлялись, почему скролл так тормозит. Оказалось, что за компанию выбрали и болб-поле, которое нафиг не было нужно
22 июн 20, 14:21    [22155163]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
ъъъъъ
Member

Откуда:
Сообщений: 795
_Vasilisk_
Симонов Денис
из запроса к одной процедуре ещё можно,
У нас когда-то написали
SELECT * FROM mytable

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

Ага, у нас так было. Сперва было select *..., а в гриде показывал поля, обращаясь к ним по имени. Потом полей стало больше, но отображение не поменялось, так как показывались лишь конкретные поля, а потом все стало тормозить. Было проапгрейжено железо сервера, изменены алгоритмы запрос-отображение, все стало нормально. А потом обнаружили, что умный датасет тянул и блобы. И, когда мы избавились от *, всё стало сверхбыстро! :)
22 июн 20, 14:31    [22155170]     Ответить | Цитировать Сообщить модератору
 Re: Миграция с IB на FB. Опыт  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
ъъъъъ
А потом обнаружили, что умный датасет тянул и блобы. :)

По-настоящему умный датасет по-умолчанию имеет FetchBlobs = False 😁

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

Откуда: Казань
Сообщений: 6693
ъъъъъ
Было проапгрейжено железо сервера, изменены алгоритмы запрос-отображение, все стало нормально. А потом обнаружили, что умный датасет тянул и блобы. И, когда мы избавились от *, всё стало сверхбыстро! :)

А представь, написали бы сразу по фен-шую - так и работали на старом железе ;)
24 июн 20, 00:04    [22156351]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Firebird, InterBase Ответить