Как синхронизировать базу кода и схему базы данных?

Так что недавно в проекте, над которым я работаю, мы изо всех сил пытались синхронизировать базу кода решения и связанную схему базы данных (Database = SQL Server 2008).

Изменения в базе данных происходят довольно регулярно (добавление столбцов, ограничений, отношений и т. Д.), И в результате люди нередко выполняют «Получить последнюю версию» из системы управления версиями и обнаруживают, что им также необходимо перестроить базу данных (а иногда они забудьте сделать последнее).

Мы не используем VSTS: Database Edition (DataDude), а стандартный проект базы данных Visual Studio со сценарием (пакетным файлом), который разрушает и воссоздает базу данных из сценариев T-SQL. Решением является решение .Net и ASP.net с LINQ to SQL, лежащим в основе ORM.

У кого-нибудь есть идеи о подходе (автоматическом или нет), который будет держать всех в курсе последней схемы базы данных?

Непрерывная интеграция с MSBuild - это вариант, но он помогает только улавливать любые зафиксированные критические изменения, но не совсем помогает в сценарии, который я выделил выше.

Мы используем Team Foundation Server, если это поможет ..


person RobS    schedule 15.01.2009    source источник
comment
ой! это такая боль. Особенно, если есть данные, которые НЕОБХОДИМО присутствовать в таблицах.   -  person Al W    schedule 15.01.2009


Ответы (8)


Хорошо, хотя это не все решение, вы должны включить утверждение в код приложения, которое связывается с базой данных, чтобы утверждать, что используется правильная схема, таким образом, по крайней мере, это становится очевидным, и вы избегаете тихих ошибок и людей, которые жалуются на этот материал. внезапно сошла с ума.

Что касается версии схемы, вы можете использовать некоторые функции, специфичные для базы данных, если они доступны, но я лично предпочитаю объявить таблицу версий схемы и сохранить там номер версии, таким образом, ее переносимость и может быть проверена с помощью простого оператора выбора

person Robert Gould    schedule 15.01.2009
comment
Это неплохая идея. Я был с вами во второй части - запуск модульных тестов быстро выявил бы рассинхронизацию схемы (каждое изменение схемы сопряжено с обновленным модульным тестом), но первая часть интересна. - person RobS; 15.01.2009
comment
Вероятно, вам также следует предоставить исходный файл на любых языках, которые вы используете, который каждый раз проверяется в источнике, в котором определена текущая версия схемы, таким образом люди могут получить доступ к информации о версии, но они должны, при условии, что вы не контролируете код адаптера базы данных. - person Robert Gould; 15.01.2009

Мы стараемся продвигаться вперед от сценариев создания.

то есть изменение базы данных не разрешено, если сценарий не был протестирован и зарегистрирован в системе управления версиями.

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

(Мне захотелось ответить на этот вопрос «с большим трудом»)

РЕДАКТИРОВАТЬ: инструменты вам не помогут, если ваш процесс неправильный.

person Spence    schedule 15.01.2009
comment
Какие инструменты вы используете для управления версиями? Как часто в схеме управления версиями построена на сервере? - person jandersson; 22.01.2009
comment
SVN, но это не имеет значения, если у вас нет завода (круиз-контроль и т. Д.). У нас есть центральный тестовый сервер, который служит нашим пультом CI, хорошая проверка работоспособности, что код все еще работает. - person Spence; 22.01.2009
comment
Это хороший ответ и в значительной степени то, за чем мы следим, но ответ Роба Гулда фактически закрыл для нас пробел. Проголосовал все же :) - person RobS; 26.01.2009

взгляните на DB Ghost - вы можете создать базу данных с помощью скриптера за секунды, а затем управлять всем кодом своей базы данных с помощью диспетчера изменений. www.dbghost.com

Именно для этого и была разработана DB Ghost.

person user53445    schedule 15.01.2009
comment
Это сильно отличается от Red Gate's SQL Tools Suite? - person RobS; 16.01.2009
comment
Пользуюсь DbGhost 10 лет и ни разу не подвел. Поддержка, которую они оказывают, не имеет себе равных. Innovartis действительно понимает управление изменениями IMO через инструмент RedGate. - person penderi; 21.02.2010

В основном мы делаем то же самое, что и вы, с проверкой скрипта генерации в системе управления версиями. Я назначенный хозяин базы данных, поэтому все изменения в самом скрипте выполняются через меня. Люди присылают мне сценарии внесенных изменений, я обновляю свою основную копию схемы, запускаю генерацию сценариев (SSMS) для создания нового сценария БД, а затем проверяю его. Я сохраняю свою копию кода в актуальном состоянии с любыми изменения, которые производятся где-то еще. У нас небольшой магазин, так что нам это подходит. Я понимаю, что это, наверное, не масштабируется.

person tvanfosson    schedule 15.01.2009
comment
Примерно так все работает в данный момент в проекте :) Я полагаю, я мог бы предупреждать людей, когда изменения схемы зафиксированы ... Хотя обычно это не влияет на всех одинаково. - person RobS; 15.01.2009

Если вы не используете Visual Studio Database Professional Edition, вам понадобится другой инструмент, который может разбить базу данных на ее элементарные части, чтобы ими было проще управлять и изменять.

Я бы рекомендовал серьезно подумать об инструментах SQL Redgate, если вы хотите сохранить здравомыслие над все изменения и обновления вашей базы данных.

person icelava    schedule 15.01.2009
comment
Мы разбили каждый объект на его собственный исходный файл, чтобы мы могли поддерживать контроль версий для каждой таблицы / хранимой процедуры ... и т. Д. - person RobS; 15.01.2009
comment
Если вы можете управлять всем этим без использования программного обеспечения / средств автоматизации, то вам под силу. - person icelava; 15.01.2009
comment
Еще рано - нам понадобится пакет Red Gate, когда проект станет более зрелым (и мы получим данные тестирования качества продукции). - person RobS; 16.01.2009

Используйте такой инструмент, как RedGate SQL Compare, чтобы сгенерировать схему изменений между любыми данная версия базы данных. Затем вы можете проверить этот файл в элементе управления исходным кодом.

person Rad    schedule 15.01.2009

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

person Community    schedule 15.01.2009

Мое решение этой проблемы простое. Определите все как XML и убедитесь, что и база данных, и ORM, и пользовательский интерфейс сгенерированы из этого XML, без исключений. Таким образом, вы можете использовать инструменты генерации кода для быстрой регенерации скрипта создания базы данных, который изменит вашу схему при (надеюсь) сохранении некоторых данных. Это требует определенных усилий, но конечный результат того стоит.

person Dmitri Nesteruk    schedule 21.02.2009