У меня есть реляционная база данных с около 100 таблицами.Каждая таблица имеет уникальный числовой первичный ключ с синтетическими значениями, и существует множество внешних ключей, которые связывают таблицы.Таблицы не большие (десятки, сотни или записи).Это база данных SQLite.
Мне нужно для целей тестирования сравнить две копии базы данных с помощью сценария linux (доступны простые сценарии bash, perl, diff, sed).Мне нужно проверить, что количество записей в обеих базах данных одинаково и что записи имеют одинаковое содержание, и вывести различия.Проблема в том, что значения ключей могут быть разными, поскольку отношения одинаковы.
Например:
Есть таблица "страна" с первичным ключом "ix_country" и "имя" и таблица "клиент" с полями "имя",первичный ключ "ix_customer" и внешний ключ "ix_country".
Эти две базы данных равны: первая база данных:
страна: имя = "США" ix_country = 1;customer: name = "Joe" ix_customer = 10 ix_country = 1
вторая база данных:
страна: имя = "США" ix_country = 1771;customer: name = "Joe" ix_customer = 27 ix_country = 1771
Обе копии имеют одинаковую структуру.
Есть ли простой способ сделать это?
Обновление:
Еще одно требование - скрипт должен быть устойчивым к изменениям в структуре.Он должен работать, если таблица или поле добавлены или удалены.
Обновление 2:
Я сам начал работать над проблемой.Общая стратегия заключается в написании сценариев SQL, которые создают файл «удостоверения личности».Карта содержит для каждой записи значение первичного ключа («искусственная идентификация») и ключ «естественная идентификация» - строку, которая однозначно идентифицирует запись.Для некоторых таблиц в базе данных существует уникальный естественный ключ идентификатора (например, имя контри в моем примере).Другие таблицы требуют порядковый номер в последовательности, а третьи объединяют свою идентичность с идентичностью в родительском (возможно, рекурсивно, если у родителя также есть родительский элемент).
Все записи выгружаются во второй текстовый файл с помощью второго сценария SQLв формате, который идентифицирует искусственные идентификаторы.
Сценарий Perl заменяет все искусственные идентификаторы во втором файле их естественными идентификаторами из карты.
Результат сортируется и разлагается.