Подтвердить что ты не робот

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

В большинстве наших проектов мы используем SQL Server 2000/2005 и Vault или SVN. Я не нашел достойного решения для захвата изменений схемы базы данных /proc в любой системе управления версиями.

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

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

Итак: как вы отслеживаете изменения кода базы данных? У вас есть рекомендуемые инструменты?


Edit:

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

Вместо этого идеальное решение будет отслеживать базу данных SQL для изменений и фиксировать любые обнаруженные изменения в SCM. Например, если SQL Server имел надстройку, которая могла бы записывать любое изменение DML с пользователем, внесшим изменение, а затем передать script этого объекта в SCM, я был бы в восторге.

Мы говорили о двух системах: 1. В SQL 2005 используйте разрешения объектов, чтобы запретить вам изменять объект до тех пор, пока вы не выполните "checkout". Затем процедура проверки будет script в SCM. 2. Запустите запланированное задание, чтобы обнаружить любые изменения и зафиксировать их (анонимно) в SCM.

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

4b9b3361

Ответ 1

Используйте версию базы данных Visual Studio для script из вашей базы данных. Работает как шарм, и вы можете использовать любую систему управления версиями, конечно, лучше всего, если у нее есть VS-плагины. Этот инструмент также имеет ряд других полезных функций. Проверьте их здесь, в этом замечательном сообщении в блоге.

http://www.vitalygorn.com/blog/post/2008/01/Handling-Database-easily-with-Visual-Studio-2008.aspx

или проверить MSDN для официальной документации

Ответ 2

Я должен сказать, что проект базы данных визуальной студии также является разумным решением дилеммы управления версиями. Если он настроен правильно, вы можете запустить сценарии по базе данных из среды IDE. Если ваш script старый, получите последнюю версию, запустите ее против БД. Имейте script, который также воссоздает все объекты, если вам нужно, новые объекты должны быть добавлены в этот script также вручную, но только один раз

Мне нравится каждая таблица, proc и функция, чтобы быть в ней собственный файл.

Ответ 3

Одно решение для бедных должно было бы добавить крюк pre-commit script, который выгружает последнюю схему db в файл и передает этот файл в ваш SVN-репозиторий вместе с вашим кодом. Затем вы можете отличать файлы схемы db от любой версии.

Ответ 4

Отслеживание изменений базы данных непосредственно из SSMS возможно с использованием различных сторонних инструментов. ApexSQL Source Control автоматически запускает любой объект базы данных, который включен в управление версиями. Инструмент не может автоматически выполнять коммиты. Вместо этого пользователь должен выбрать, какие изменения будут совершены.

При получении изменений из репозитория ApexSQL Source Control знает о ссылочной целостности базы данных SQL. Таким образом, он создаст сценарии синхронизации, включая все зависимые объекты, которые будут обернуты в транзакции, поэтому либо все изменения будут применены в случае, если ошибка не встречается, либо ни одно из выбранных изменений не применяется. В любом случае целостность базы данных остается незатронутой.

Ответ 5

Я просто передаю SQL-alter-Statement дополнительно к полному выражению SQL-CreateDB.

Ответ 7

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

В SQL 2005 вам нужно написать немного кода, чтобы сгенерировать все объекты в отдельные файлы.

Ответ 8

Роллинг с нуля будет не очень выполнимым, но если вы используете инструмент сравнения sql, например Redgate SQL Compare SDK, чтобы сгенерировать измените файлы для вас, вам не понадобится очень много времени, чтобы выполнить половину броска, что вы хотите, а затем просто проверьте эти файлы в исходном элементе управления. Я применил что-то подобное для себя, чтобы обновить изменения от наших систем разработки до наших живых систем всего за несколько часов.

Ответ 9

В нашей среде мы никогда не меняем БД вручную: все изменения выполняются скриптами во время выпуска, а скрипты хранятся в системе управления версиями. Одна важная часть этой процедуры состоит в том, чтобы убедиться, что все сценарии могут быть запущены снова против одного и того же БД, сценарии являются идемпотентными?) Без потери данных. Например, если вы добавите столбец, убедитесь, что вы ничего не делаете, если столбец уже существует.

Ваш комментарий о "предложениях имеет недостаток, который требует, чтобы разработчик выполнил какую-то процедуру", на самом деле является контрольным. Это не недостаток, это особенность. Контроль версий помогает разработчикам в следующих процедурах и делает процедуры менее болезненными. Если вы не хотите следовать процедурам, вам не нужен контроль версий.

Ответ 10

Наши dbas периодически проверяют prod на то, что находится в SVN, и удаляют любые объекты, не находящиеся под контролем источника. Это нужно только один раз, прежде чем разработчики никогда не забудут что-то снова поставить в исходное управление.

Мы также не позволяем кому-либо перемещать объекты в prod без script, так как наши разработчики не имеют прав prod, которые легко обеспечить.

Ответ 11

В одном проекте я уделил пристальное внимание в дизайне, что все важные данные в базе данных могут автоматически воссоздаваться из внешних мест. При запуске приложение создает базу данных, если она отсутствует, и заполняет ее из внешних источников данных, используя схему в исходном коде приложения (и, следовательно, версию с приложением). Имя хранилища базы данных (имя файла sqlite, хотя большинство менеджеров баз данных допускает несколько баз данных) включает в себя версию схемы, и мы увеличиваем версию схемы всякий раз, когда мы совершаем изменение схемы. Это означает, что при перезагрузке приложения в новой версии с другой схемой создается и заполняется новое хранилище базы данных. Если нам нужно вернуть развертывание на старую схему, тогда новый запуск старой версии будет использовать старый хранилище баз данных, поэтому мы можем быстро выполнить понижение в случае возникновения проблем.

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

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

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

Ответ 12

Если вы используете .Net и как подход Rails принимает с помощью Migrations, я бы рекомендовал Migrator.Net.

Я нашел хороший учебник, который просматривает его настройку в Visual Studio. Он также предоставляет примерный проект для ссылки.

Ответ 13

Мы разработали специальный инструмент, который обновляет наши базы данных. Схема базы данных хранится в нейтральном с базы данных файле XML, который затем считывается и обрабатывается инструментом. Схема хранится в SVN, и мы добавляем соответствующий комментарий, чтобы показать, что было изменено. Это работает очень хорошо для нас.

Хотя это решение, безусловно, слишком велико для большинства проектов, это, безусловно, делает жизнь проще.

Ответ 14

Чтобы отслеживать все изменения, такие как обновление и удаление вставки, для SVN будет много накладных расходов. Лучше отслеживать только изменения ddl, такие как (alter, drop, create), который изменяет схему. Вы можете легко отслеживать эту схему, создав таблицу и триггер для вставки данных в эту таблицу. Каждый раз, когда вы хотите, чтобы u мог получить статус изменения, запросив из этой таблицы Здесь много примеров здесь и здесь