powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
37 сообщений из 37, показаны все 2 страниц
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542140
Snake174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Работаю с базами данных совсем недавно и столкнулся с такой задачей:
Есть 2 базы данных Firebird 2.5. Нужно сравнить эти базы (структуру и данные) и выдать результат в виде файлов *.ddl и *.sql с содержанием типа: insert into TABLE1 (...) values (...).
Читал про EXECUTE STATEMENT, не понял ничего.
Нужно чтобы данные в одной базе данных соответствовали данным в другой базе данных.
Есть какой-нибудь пример выборки данных из таблицы оной базы данных и сравнением с другой таблицей в другой базе данных?
Как вообще делаются такие вещи?
Спасибо.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542154
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174,

IBExpert это умеет делать
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542172
Snake174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Да я знаю, что есть специальные утилиты для этого. Но мне нужно под линукс и самому это сделать ПРОГРАММНО. Мне бы какой-нибудь пример выборки из внешней базы данных.
Спасибо что откликнулись.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542178
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174Читал про EXECUTE STATEMENT, не понял ничего.Где читал и как смог не увидеть примеров ?
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542192
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Snake174!
You wrote on 29 января 2014 г. 15:10:40:

Snake174> мне нужно под линукс и самому это сделать ПРОГРАММНО.
обращайся в подфорум "работа".
тебе программист нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542202
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174,

это подойдёт http://firebirdsql.su/doku.php?id=execute_statement
($firebird)/doc/sql.extensions/README.execute_statement.txt
($firebird)/doc/sql.extensions/README.execute_statement2.txt
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542229
Snake174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Спасибо. Вот недавно на это же описание наткнулся. Сижу, разбираюсь.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542261
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замерли в ожидании чуда!
Отлично знающие всю "кухню" люди такой инструмент месяцами выпиливают, и годы доводят до блеска, а тут щас бац! и готов программный инструмент под линукс для полной синхронизации баз по метаданным и данным.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542268
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, прозевал, какое было 10000-ным?
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542269
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа, а каким боком execute statement относится к сравнению баз? Не нужен он тут совершенно.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542290
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvгоспода, а каким боком execute statement относится к сравнению баз?
у так чтобы их сравнить, надо их как-то доставить в одно место, где и будет производиться
сравнение. Традиционно таким местом является клиентское приложение, но аффтар решил пойти
своим путём и делать это в ХП.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542373
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Т.к. упоминаются такие слова как Qt4/C++, линкус, то похоже всё-таки не в ХП.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542407
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovно аффтар решил пойти своим путём и делать это в ХП.
думаю, он случайно увидел буквосочетание ES, и его на нем заклинило. Теоретически через ES и даже ES on external что-то можно сделать, но это а) трудоемко б) тормозно.
Просто сделать два коннекта Snake174 почему-то не догадался.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542419
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174Всем привет.
Работаю с базами данных совсем недавно и столкнулся с такой задачей:
Есть 2 базы данных Firebird 2.5. Нужно сравнить эти базы (структуру и данные) и выдать результат в виде файлов *.ddl и *.sql с содержанием типа: insert into TABLE1 (...) values (...).
Читал про EXECUTE STATEMENT, не понял ничего.
Нужно чтобы данные в одной базе данных соответствовали данным в другой базе данных.
Есть какой-нибудь пример выборки данных из таблицы оной базы данных и сравнением с другой таблицей в другой базе данных?
Как вообще делаются такие вещи?
Спасибо.
Как уже было сказано, если тебе надо через Qt, то и делай через Qt и execute statement тут вообще не при делах. Тоесть подключаешся к твоим базам данных, делаешь в обеих "select * from sometable" и сравниваешь получившиеся результаты. По результатам сравнения генерируешь тексты запросов.

В свое время в Qt были проблемы с поддержкой FB (не помню деталей, но пришлось делать какие-то лишние телодвижения с драйвером - то ли его не было в стандартной поставке, то ли он был не сконфигурирован - не помню), как теперь - не знаю.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542420
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и кроме того, любые "сравниватели таблиц" работают ужасно медленно, потому что алгоритм лучше не придумать.
См. ChangeManager .

Собственно, автор рискует пытаться повторить функционал Change Manager (за исключением сравнения конфигураций).
Для справки - лицензия на раб. место на 1 сервер стоит примерно 960 долларов.
И там все весьма непросто.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542683
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисIBExpert это умеет делать а если обернуть ibescript.dll своей оберткой, то будет "программно".
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542725
Фотография kgb ussr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyСимонов ДенисIBExpert это умеет делать а если обернуть ibescript.dll своей оберткой, то будет "программно".
Э... а что, в ibescript.dll заложен функционал dbcomparer-а?
Или ты о чем?
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542805
Snake174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Я с самого начала так и сделал, но потом подумал, может быть как-нибудь с помощью SQL можно это сделать быстрее. Просто чтение и сравнение в программе происходят долго, да еще и формирование патчей одновременно происходит.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542809
Snake174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miwaonline,

Использую Qt 4.7.4 с драйвером проблем нет.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542812
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174Просто чтение и сравнение в программе происходят долго
Значит ты их неправильно делаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542929
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kgb ussrв ibescript.dll заложен функционал dbcomparer-а?Да.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542945
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174 Просто чтение и сравнение в программе происходят долго
скорость зависит от множества условий. Для начала надо убедиться, что вообще абстрактное чтение (прогон по записям одной таблицы) происходит максимально быстро - компоненты могут добавлять оверхед, который м.б. нельзя победить (или можно).
Потом надо определиться с буферизацией одной из сравниваемых таблиц. Например, если это мелкая таблица, ее было бы неплохо закэшировать. Если большая - кэшировать нельзя, сожрет много памяти (вопрос, сколько ресурсов есть).
Причем, через count определять кол-во записей нельзя, это долго, значит надо использовать трюк с обновлением статистики по индексу ПК и получением кол-ва записей как 1/selectivity.
Дальше, по каким столбцам сравнивать.

Наконец, сам алгоритм сравнения двух множеств.

Snake174может быть как-нибудь с помощью SQL можно это сделать быстрее
Ну, через Execute block + execute statement on external можно, но мне кажется, для начала надо сделать вариант без этого. Конечно, при EB+ES с одной стороны не будет буферизации на клиенте, но возможно это и плохо, и также это может работать медленнее "клиентского" варианта.
Придется экспериментировать.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542950
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvПотом надо определиться с буферизацией одной из сравниваемых таблиц.
Это ещё зачем? Обе таблицы читаются последовательно, каждая запись - ровно по одному разу.
Зачем хранить то, что уже никогда не потребуется?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542953
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DS> Зачем хранить то, что уже никогда не потребуется?..

Потому шо гладиолус! (с)
Не мешай человеку.
Нехай буферизирует.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542955
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну, да, похоже с буферизацией я прогнал. мысль какая-то проскочила, но не оформилась.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542971
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будто про EB+ES ты всё правильно сказал. :)
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542972
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

а что там я неправильно сказал?
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542986
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да всё, практически. Чем плодить кривую наколенку
(не смотрел, что конкретно предоставляет в данном
случае ibescript - напрямую результат сравнения или
промежуточные данные) в абсолютном большинстве
случаев лучше делать это на сервере.

Контра всего 3 - не 2.5, нет доступа к БД2 из БД1
(что сомнительно) и какие-то неозвученные доп.
моменты типа доп.действий на клиенте (DDL etc).

P.S. Я даже больше скажу - если бы требовалось
бы простое сравнение метаданных БД клиентов
(сопровождение, апдейты и пр.) - я бы вообще не
парился и какой-нибудь "функцией" (любой хеш)
сабж проверял бы: типа не сходится - сразу в сад.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38542995
Snake174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovSnake174Просто чтение и сравнение в программе происходят долго
Значит ты их неправильно делаешь.


Первая БД - с которой сравниваю, вторая БД должна получиться как первая.

Сейчас я делаю так:
1) Получаю список имён таблиц в обеих базах.
2) Если в 1-ой БД есть какая-нибудь таблица, а во 2-ой её нет - получаю структуру этой таблицы и создаю её во 2-ой БД со всеми данными из 1-ой. Если в 1-ой БД нет таблицы, а во 2-ой есть - удаляю из 2-ой БД эту таблицу.
3) Формирую файл patch.ddl.
4) Загружаю данные из таблиц 1-ой и 2-ой БД.
5) Каждую запись 1-ой таблицы из 1-ой БД сравниваю со всеми записями из таблицы 2-ой БД.
6) Если что-то не совпадает, записываю в файл patch.sql.

Тут ещё со связями таблиц некоторая заморочка. Нужно определять какая таблица с какой связана, получать ID записей и как-то объеденить это всё.

Но пока вроде работает, определяет каких записей не хватает или они отсутствуют, формируются файлы, только связи с таблицами не установлены.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543086
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake1744) Загружаю данные из таблиц 1-ой и 2-ой БД.
5) Каждую запись 1-ой таблицы из 1-ой БД сравниваю со всеми записями из таблицы 2-ой БД.

Не надо так делать

зы.
сортировка и чтение отсортированных НД с сравнением тебе помогут
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543120
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Snake174Тут ещё со связями таблиц некоторая заморочка. Нужно определять какая таблица с какой связана, получать ID записей и как-то объеденить это всё.

И зачем тут нужны ID записей??

ps/ как по мне то в самом начале убить все ФК и в самом конце создать все ФК заново,
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543316
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГР: Как будто про EB+ES ты всё правильно сказал
kdv: а что там я неправильно сказал?
ГР: Да всё, практически.

просто прекрасно. При этом ты сам пронес ахинею, особенно про "типа не сходится - сразу в сад". Потому что он с самого начала писал про diff.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543713
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> При этом ты сам пронес ахинею

Прекрасно. Останемся при своих двух ахинеях.
А читатели пусть выбирают меж двух ахиней,
какая разумнее и правильнее. На клиент тащить
все данные обеих БД , ага. В мемориз.

kdv> особенно про "типа не сходится - сразу в сад".
kdv> Потому что он с самого начала писал про diff.

Там стоит постскриптум и "если". Читай внимательнее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543739
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

согласись, что алгоритмически все должно быть примерно одинаково, что через клиента, что через ES. Но ES гораздо сложнее пишется. Особенно я не вижу смысла в ES при сравнении метаданных.
Так что вполне можно вначале сделать обычного клиента, а потом, при желании - на ES. Мне даже интересно, существует-ли уже у кого то подобное решение.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543753
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> согласись, что алгоритмически все должно быть
kdv> примерно одинаково, что через клиента, что через ES

Не совсем. На сервере есть ещё SQL, в т.ч. множественный,
на клиенте же только построчное сравнение.

kdv> Но ES гораздо сложнее пишется

Я бы так не сказал. Более того, ES-скрипт пишется один раз.

kdv> Особенно я не вижу смысла в ES при сравнении метаданных.

Я бы сказал, что никакой разницы нет. Сосвсем никакой.

kdv> Так что вполне можно вначале сделать обычного клиента,
kdv> а потом, при желании - на ES.

Ты всерьёз не понимаешь, что это во-первых, мартышкин труд
двойная работа, а во-вторых, тащить (повторяю) все записи обех БД
на клиента
не лучшая идея при наличии альтернатив?

kdv> Мне даже интересно, существует-ли уже у кого то подобное решение.

У Хвастунова и Лободы? :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543817
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНе совсем. На сервере есть ещё SQL, в т.ч. множественный,
на клиенте же только построчное сравнение.
for select/for execute statement тоже построчный.
while not Q.Eof
do
Q.Next
то же самое. А join из двух баз сделать нельзя. Так что в ES будут те же циклы. А значит алгоритмически решение будет мало отличаться. Ну и, на клиенте запрос для поиска идентичной записи конструировать тоже проще (я про where).

Гаджимурадов РустамТы всерьёз не понимаешь, что это во-первых, мартышкин труд
двойная работа, а во-вторых, тащить (повторяю) все записи обех БД
на клиента не лучшая идея при наличии альтернатив?
Например, я вижу функционал ChangeManager. Он вообще на Java написан. Понятно что ES он использовать не будет.
Допустим, ES альтернатива, но автор-то "не разобрался". Если идеи нет, в ES тоже фигня получится.

Гаджимурадов Рустамkdv> Особенно я не вижу смысла в ES при сравнении метаданных.
Я бы сказал, что никакой разницы нет. Совсем никакой.
есть, потому что в отличие от данных метаданные разбросаны по разным таблицам. Тупо сравнивать rdb$fields не пройдет.

Впрочем, не вижу тут предмета для спора, это всего лишь варианты реализации. Например, если у автора базы небольшие, я бы с ES связываться не стал, т.к. выигрыш вряд ли будет серьезно значимым.

Гаджимурадов РустамУ Хвастунова и Лободы? :)
я про сравнение данных и метаданных через ES.
...
Рейтинг: 0 / 0
Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
    #38543832
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> А значит алгоритмически решение будет мало отличаться

Отличатеся как минимум тем, что не всё уйдёт на клиента, а только половина.
Плюс всё это будет не жестко зашито в exe, а в какой-нибудь ХП.
Ну и наконец об конкретном алгоритмическом решении можно рассуждать
только тогда, когда будёт чёткая постановка задачи, а не как тут.

> Ну и, на клиенте запрос для поиска идентичной записи
> конструировать тоже проще (я про where).

А в чём разница? Конкатенация строк есть и там, и там.

> Например, я вижу функционал ChangeManager.
> Допустим, ES альтернатива, но автор-то "не разобрался".
> Если идеи нет, в ES тоже фигня получится.

Вообще, забавная логика, альтернативная.
Если идеи нет, то на клиенте лучше, да.

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

Тоже в мемориз.

> Тупо сравнивать rdb$fields не пройдет.

Ты уже пробовал? И что именно не получилось?

> Впрочем, не вижу тут предмета для спора

Аналогично. Аминь.

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

Я бы вообще ничего вручную делать не стал, ни в ES, ни
тем более не клиенте. Есть IBE, есть ibeblock, ibescript и
ibec_CompareMetadata, есть, наконец, готовые решения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5: Программно сравнить 2 базы (Qt4/C++)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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