У нас была та же проблема в проекте, в котором я сейчас работаю. Мы приняли Тарантино в качестве решения, которое работает на удивление хорошо. Каждый разработчик работает против локальной базы данных. Когда разработчику необходимо внести изменения в схему, он создает сценарий и регистрирует его.
Тарантино отслеживает, какие сценарии уже запущены каждым разработчиком в своей локальной базе данных, и применяет новые сценарии. Поэтому, если разработчик A вносит изменения и проверяет сценарий SQL, разработчик B получит это изменение, когда получит последние файлы из системы контроля версий. Когда разработчик B запускает Tarantino локально, будут применяться только самые последние сценарии.
Конечно, большая часть этого может быть сделана вручную. Тарантино делает это проще, но не идеально. Одним из преимуществ является то, что он может быть легко интегрирован в процесс сборки. Также можно создавать сценарии для обслуживания данных в базах данных.