Проверьте изменения базы данных (контроль версий) - PullRequest
10 голосов
/ 08 октября 2009

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

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

Как отследить эти изменения? Мне не нужно отслеживать, что изменилось, но мне нужно только проверить, синхронизируются ли таблицы базы данных, представления, процедуры и т. Д. С версией базы данных, сохраненной в таблице версий.

Зачем мне это нужно? При выполнении развертывания мне нужно убедиться, что база данных «правильная». Кроме того, не все таблицы или другие объекты базы данных должны отслеживаться. Можно ли проверить без использования триггеров? Можно ли обойтись без сторонних инструментов? Есть ли в базах данных контрольные суммы?

Допустим, мы используем SQL Server 2005.

Отредактировано:

Я думаю, что я должен предоставить немного больше информации о нашей текущей среде - у нас есть "базовая линия" со всеми сценариями, необходимыми для создания базовой версии (включая объекты данных и "метаданные" для нашего приложения). Однако существует много установок этой «базовой» версии с некоторыми дополнительными объектами базы данных (дополнительные таблицы, представления, процедуры и т. Д.). Когда мы вносим некоторые изменения в «базовую» версию, мы также должны обновить некоторые установки (не все) - тогда мы должны проверить, что «базовая» находится в правильном состоянии.

Спасибо

Ответы [ 11 ]

6 голосов
/ 08 октября 2009

Вы, кажется, нарушаете первое и второе правило " Три правила для работы с базой данных ". Использование одной базы данных на разработчика и одного авторитетного источника для вашей схемы уже очень поможет. Тогда я не уверен, что у вас есть Baseline для вашей базы данных и, что еще более важно, что вы используете change scripts . Наконец, вы можете найти другие ответы в Представлениях, Хранимых процедурах и т. П. и в Ветвлении и Объединении .

На самом деле, все эти ссылки упоминаются в этой замечательной статье Джеффа Этвуда: Получите вашу базу данных под управлением версиями . А читать надо ИМХО.

5 голосов
/ 08 октября 2009

Мы используем DBGhost для контроля версий базы данных. Сценарии для создания текущей базы данных хранятся в TFS (вместе с исходным кодом), а затем DBGhost используется для создания дельта-сценария для обновления среды до текущей версии. DBGhost также может создавать дельта-сценарии для любых статических / справочных / кодовых данных.

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

1 голос
/ 08 октября 2009

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

Мне также хотелось бы, чтобы разработчики запускали локальный скрипт сборки для повторного запуска своего локального окна разработки. Таким образом, они всегда могут откатиться назад. Что еще более важно, они могут создавать интеграционные тесты, которые проверяют состояние их приложения (хранилище и доступ к данным) и логику, хранимую в хранимой процедуре, автоматически. Запуск инициализации (сброс БД), тесты интеграции (создание пуха в БД), повторная инициализация для возврата БД в чистое состояние и т. Д.

Если вы являетесь пользователем в стиле SVN / nant (или аналогичным) с концепцией одной ветви в вашем хранилище, вы можете прочитать мои статьи на эту тему в DotNetSlackers: http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Build-automation-with-NAnt.aspx и http://dotnetslackers.com/articles/aspnet/Building-a-StackOverflow-inspired-Knowledge-Exchange-Continuous-integration-with-CruiseControl-NET.aspx.

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

UPDATE

@ Sazug: «Да, мы используем несколько сборок с несколькими ветвями, когда используем базовый сценарий + дополнительные сценарии :) Какие-нибудь базовые советы для такого рода автоматизации без полной статьи?» Чаще всего существуют две формы баз данных:

  • вы управляете БД в новой среде непроизводственного типа (только для активных разработчиков)
  • производственная среда, в которой у вас есть живые данные, накапливающиеся в процессе разработки

Первая настройка намного проще и может быть полностью автоматизирована от dev до prod и включать откат prod при необходимости. Для этого вам просто нужна папка скриптов, в которой каждая модификация вашей базы данных может храниться в файле .sql. Я не советую вам хранить файл tablename.sql, а затем делать его версию, как если бы вы были файлом .cs, где обновления этого артефакта sql фактически изменяются в одном и том же файле с течением времени. Учитывая, что объекты sql так сильно зависят друг от друга. Когда вы создаете базу данных с нуля, ваши скрипты могут столкнуться с серьезными изменениями. По этой причине я предлагаю вам сохранить отдельный и новый файл для каждой модификации с порядковым номером в начале имени файла. Например что-то вроде 000024-ModifiedAccountsTable.sql. Затем вы можете использовать пользовательское задание или что-то из NAntContrib или прямое выполнение одного из множества инструментов командной строки SQL.exe, чтобы запустить все ваши сценарии для пустой базы данных от 000001-fileName.sql до последнего файла. в папке updateScripts. Все эти сценарии затем регистрируются в вашем контроле версий. И поскольку вы всегда начинаете с чистого db, вы всегда можете откатиться, если кто-то новый sql нарушит сборку.

Во второй среде автоматизация - не всегда лучший путь, учитывая, что вы можете повлиять на производство. Если вы активно разрабатываете для / для производственной среды, то вам действительно нужна многоотраслевая / среда, чтобы вы могли протестировать свой способ автоматизации, прежде чем вы действительно столкнетесь с производственной средой. Вы можете использовать те же понятия, что указаны выше. Тем не менее, вы не можете начать с нуля на прод-дБ, и откат от него сложнее. По этой причине я предлагаю использовать RedGate SQL Compare в вашем процессе сборки. Сценарии .sql регистрируются для целей обновления, но перед запуском обновлений необходимо автоматизировать diff между вашими промежуточными db и prod db. Затем вы можете попытаться синхронизировать изменения и откатить продукт, если возникнут проблемы. Кроме того, некоторая форма резервного копирования должна быть предпринята до автоматического изменения SQL-изменений. Будьте осторожны, когда делаете что-либо без бдительного человеческого взгляда на производстве! Если вы выполняете настоящую непрерывную интеграцию во всех ваших средах разработки / квалификации / промежуточной обработки / производительности, а затем выполняете несколько ручных шагов при запуске в производство ... это действительно неплохо!

1 голос
/ 08 октября 2009

Я использую простой файл VBScript на основе этой статьи проекта кода для генерации сценариев удаления / создания для всех объектов базы данных. Затем я поставил эти скрипты под контроль версий.

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

  • получить последнюю версию сценариев удаления / создания из системы контроля версий (в нашем случае это subversion)
  • выполнить сценарий SqlExtract для проверяемой базы данных, переписав сценарии из управления версиями
  • теперь я могу проверить с помощью моего клиента Subversion (TortoiseSVN), какие файлы не совпадают с версией под управлением версией
  • теперь либо обновите базу данных, либо поставьте измененные сценарии под контроль версий
0 голосов
/ 04 июня 2010

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

.
0 голосов
/ 29 октября 2009

Я согласен с другими постами, что разработчики не должны иметь разрешений на изменение производственной базы данных. Либо разработчики должны делиться общей базой данных разработки (и рисковать наступлением друг на друга), либо они должны иметь свои собственные отдельные базы данных. В первом случае вы можете использовать такой инструмент, как SQL Compare, для развертывания в рабочей среде. В последнем случае вам необходимо периодически синхронизировать базы данных разработчика в течение жизненного цикла разработки, прежде чем переходить в рабочий режим.

Здесь, в Red Gate, мы вскоре собираемся выпустить новый инструмент, SQL Source Control, разработанный, чтобы сделать этот процесс намного проще. Мы будем интегрироваться в SSMS и позволять добавлять и извлекать объекты в систему управления исходным кодом и из нее одним нажатием кнопки. Если вы хотите узнать больше или зарегистрироваться в нашей программе раннего доступа, посетите эту страницу:

http://www.red -gate.com / Продукты / SQL_Source_Control / index.htm

0 голосов
/ 08 октября 2009

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

Контроль изменений жизненно важен в любой системе, на которую вы рассчитываете работать (если во всей системе задействовано> 1 инженера).

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

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

* вы пишете сценарии отката, верно?

0 голосов
/ 08 октября 2009

В одном из наших проектов мы сохранили версию базы данных внутри базы данных.

Каждое изменение в структуре базы данных было записано в отдельный файл sql, который увеличивал версию базы данных помимо всех других изменений. Это было сделано разработчиком, который изменил структуру БД.

Сценарий развертывания проверен на соответствие текущей версии БД и сценария последних изменений и при необходимости применил эти сценарии SQL.

0 голосов
/ 08 октября 2009

Если у вас есть Visual Studio (в частности, редакция базы данных), существует Database Project, который вы можете создать и указать на базу данных SQL Server. Проект загрузит схему и предложит вам множество других функций. Он ведет себя так же, как проект кода. Это также дает вам преимущество в написании сценариев для всей таблицы и ее содержимого, чтобы вы могли хранить ее в Subversion. Когда вы строите проект, он проверяет целостность базы данных. Это довольно умно.

0 голосов
/ 08 октября 2009

Надеюсь, у кого-то есть лучшее решение, чем это, но я делаю это, используя несколько методов:

  • Иметь «транковую» базу данных, которая является текущей версией разработки. Вся работа здесь выполняется, так как она готовится к включению в релиз.
  • Каждый раз, когда релиз сделан:
    • «Чистая» база данных последнего выпуска копируется в новую, например, «DB_1.0.4_clean»
    • SQL-Compare используется для копирования изменений из транка в 1.0.4_clean - это также позволяет точно проверить, что включается.
    • SQL Compare снова используется для поиска различий между предыдущим и новым выпусками (изменения с DB_1.0.4_clean на DB_1.0.3_clean), что создает скрипт изменения "1.0.3 - 1.0.4.sql".

Мы все еще создаем инструмент для автоматизации этой части, но цель состоит в том, чтобы была таблица для отслеживания каждой версии базы данных и применения сценария изменения. Средство обновления ищет последнюю запись, затем применяет каждый сценарий обновления один за другим, и, наконец, БД имеет последнюю версию.

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

  • Мы действительно делали это некоторое время, и это была ОГРОМНАЯ боль. Это было легко забыть, и в то же время были внесены изменения, которые не обязательно делали это - так что полный сценарий обновления, созданный с использованием индивидуально созданных сценариев изменений, иногда добавлял поле, а затем удалял его, все в один выпуск. Очевидно, это может быть довольно болезненным, если есть изменения индекса и т. Д.

Хорошая вещь в сравнении SQL - это сценарий, который он генерирует, находится в транзакции, и, если он потерпит неудачу, он откатит все назад. Таким образом, если производственная БД была изменена каким-либо образом, обновление завершится неудачно, и тогда группа по развертыванию может фактически использовать SQL Compare на производственной БД с _clean db и вручную исправить изменения. Мы только должны были сделать это один или два раза (проклятые клиенты).

Сценарии изменения .SQL (сгенерированные SQL Compare) сохраняются в нашей системе контроля версий (subversion).

...