Хотя это может быть дорого, такой инструмент, как TOAD для Oracle , может быть идеальным для решения такого рода проблем.
Тем не менее, мое предпочтительное решение состоит в том, чтобы начать со всего DDL (включая определения хранимых процедур) в виде текста, управляемого под управлением версией, и написать сценарии, которые будут создавать работающую базу данных из источника. Если кто-то хочет изменить схему, он должен, должен, должен зафиксировать эти изменения в хранилище, а не просто изменить базу данных напрямую. Без исключений! Таким образом, если вам нужно создать сценарии, которые отражают обновления между версиями, нужно принять все зафиксированные изменения, а затем добавить любой DML, который вам нужен, чтобы преобразовать любые существующие данные в соответствие с изменениями (добавив значения по умолчанию для новых столбцов для существующие строки и т. д.) Для всех DDL (и предварительно заполненных данных) в виде текста сбор различий так же прост, как и различие двух исходных деревьев.
На моей последней работе у меня были сценарии NAnt, которые восстанавливали тестовые базы данных, запускали все необходимые сценарии обновления в зависимости от версии базы данных, а затем выводили конечный результат в DDL и DML. Я бы сделал то же самое для пустой базы данных (чтобы создать ее с нуля), а затем сравнить результаты. Если бы они были существенно различны (программа дампа не была идеальной), я мог бы сразу сказать, какие изменения необходимо внести в обновление / создание DDL и DML. Хотя я использовал инструменты сравнения баз данных, такие как TOAD, они были не так полезны, как рукописный SQL, когда мне нужно было создавать общие сценарии для массирования данных. (Машинный код может быть очень хрупким.)