сравнение структуры 2х баз данных

centur
Дата: 25.02.2004 12:21:21
Есть проект, состоящий из распределенных в пространстве stand-alone серверов с PostgreSQL 7.4.(модифицированная версия) Есть активный центральный сервер, где собираются все данные и обрабатываются. На нем же, происходит и развитие структуры БД. Есть задача приведения структуры бд на удаленных серверах к структуре центрального сервера, при этом необходимо сохранить данные на удаленном сервере, т.к. они не полностью совпадают с тем, что на центральном. Для примера:
Есть таблица central.tab с полями a и b , был когда то произведен перенос этой таблицы на remote.table_a с теми же полями. Далее в процессе разработки central.tab получила столбец с , но a был вынесен в другую таблицу. на момент обновления ПО на удаленном сервере, уже скопился определенный объем уникальной информации, которой нету в central.tab. Как и чем произвести мягкий автоматизированный переход на новую структуру, если есть все соответствия новых полей и таблиц старым. Или хотя бы как сравнить структуры и понять что поменялось.. Пробовали ERWin, но необходимый результат достигнут не был.
Возникла еще бредовая идея типа написания скрипта который бы по системным таблицам с нуля восстанавливал структуру и просто тупо с помощью какого-либо windiff'а сравнить текст создания структуры

Например восстановление старого tab выглядит как
create table tab (temp_column int)
alter table tab add column a
alter table tab add column b
alter table tab drop temp_column

в новой структуре это будет как

create table tab (temp_column int)
alter table tab add column b
alter table tab add column с
alter table tab drop temp_column

create table tab2 (temp_column int)
alter table tab2 add column a
alter table tab2 drop temp_column


при проходе winDiff покажет что a из старой структуры исчез, добавился c и появилась новая сущность tab2.

Данные перекачивать пока даже не знаю как....

Понимаю что подход очень извратный, но проблема в том, что стандартные средства не помогли это сделать.

Если кто сталкивался с подобными задачами и успешно решил их или может подсказать идеи, как их решить - напишите пожалуйста здесь или на контактную инфу:
ICQ - 864050
mail: centur@dezcom.mephi.ru
Genady
Дата: 25.02.2004 12:38:44
Не знаю как в ERwin а в power designer делаешь реверс по обеим структурам, одну сохраняешь в види архивной модели, вторую в виде текущей, выбираешь в меню Database -> Modify Database ставишь соответствующие галочки, после чего дизайнер сгенерит скрипт в котором создает копии рабочих таблиц, перегоняет туда данные, создает новую структуру и сливает из копий таблиц данные. Если натыкается в структуре на констрейнты (например новое поле с not null-ом) и залить из старой схеме данные не может помечает те места коментариями, чтоб можно было исправить ручками.
centur
Дата: 11.03.2004 07:09:12
а поподробнее можно ? а то у меня повердизайнер 7.4 не понимает, я сам не могу понять как можно создать базы из скриптов (реверс инжиниринг пробовал - не очень удачно. есть ли другой способ или как им пользоваться верно )
Если можно - дайте контакт - мыло или аську - чтобы быстрее общаться
Genady
Дата: 11.03.2004 10:43:02
2 centur

Мыло в профайле смотри.
Power designer лучше возьми поновее, для разовой работы может даже ознакомительная версия десятки сгодиться.
PostgreSQL user
Дата: 18.03.2004 15:00:10
> Есть таблица central.tab с полями a и b , был когда то произведен перенос этой
> таблицы на remote.table_a с теми же полями. Далее в процессе разработки
> central.tab получила столбец с , но a был вынесен в другую таблицу. на момент
> обновления ПО на удаленном сервере, уже скопился определенный объем
> уникальной информации, которой нету в central.tab.

Изначально плохо спроектированная база данных. Не должно возникать ситуаций с переносами полей из таблицы в таблицу.

Решить описанную проблему можно попробовать следующим образом: вести лог в каждой из баз данных: что, кем, когда и куда добавлено. Кроме того, в центральной базе необходимо описать и поддерживать актуальной структуру всех баз (если они одинаковы, то это достаточно просто). Все изменения в базе фиксируются в таблицах, описывающих структуру баз.

Теперь достаточно просто получить структуру любой базы данных на любой момент времени и внести в любую из них требуемые изменения.

Но не рекомендовал бы так делать: это _очень_ геморройный путь. Возможно, проще будет все переписать.
centur
Дата: 18.03.2004 21:25:45
ммм... база в процессе проектирования и доработки. одновременно создается распределенная система..
но вы не поняли вопроса - перенос не из таблицы в таблицу, хотя и такой бывает.
проблема в синхронизации версий базы.
Вот Геннадий подсказал решение. но к сожалению 10 ПД не в полном объеме поддерживает 7.4.1 постгрю, по крайней мере reverse database дает не самые показательные результаты, и опять же - не смог сделать как сказал Геннадий
будем пытаться.
eddie
Дата: 19.06.2004 02:33:45
/topic/97795