Проект типа Database Project в Visual Studio вещь очень удобная, но есть один неприятный момент, а именно производственная база данных может отличаться по структуре и прочим атрибутам от базы данных разработчиков. Причем эти отличия, заключаются, не в том, что не все разработки еще перенесены, а носят принципиальный характер, например пользователи, какие-то таблицы, нужные только для производственной среды и не имеющие отношения к разрабатываемому проекту.
Можно конечно хранить все в одном проекте, и перед очередной публикацией добавлять/убирать комментарии или включать/выключать скрипты из build. Но чуть подумав, я вроде нашел способ лучше и изящнее.
Еще в Visual Studio 2010 существовало такое понятие, как Composite Database Project, попробуем применить данный подход для решения стоящей перед нами задачей, а именно просто унаследуем производственную базу данных от базы данных разработчиков.
Для проверки этой идеи сделаем простейший тест.
Шаг 0. Подготовительный
Создаем на сервере две пустых базы данных:
DevDb - база данных разработчиков
ProdDb - производственная база данных.
DevDb должна содержать две таблицы: tab1 и tab3, имеющих очень простую структуру (для теста нам этого будет достаточно): [Id] INT NOT NULL. tab1 и tab3 - это нормальные таблицы, участвующие в разработке.
ProdDb, в отличие от DevDb должна содержать дополнительную таблицу tab2 (структура таблиц для нас не важна, главное их наличии) с похожей структурой. tab2 - это таблица специфичная только для производственной базы данных и не имеющая к отношения к разрабатываемому продукту.
Шаг 1. Создание проектов баз данных
Создаем пустой solution.
Добавляем Database project для базы данных разработчиков: DevDb
В проект добавляем две таблицы, скрипты таблиц ниже:
Строим проект (Build)
Добавляем в solution проект производственной базы данных ProdDb
В проект добавляем таблицу tab2
И теперь наследуемся от проекта DevDb, добавляя его в Database References.
Обязательно указывая Database Location: Same database
Шаг 2. Публикация баз данных
Публикацию баз данных производим штатным образом, естественно каждый проект имеет собственную строку подключения
Видим в результаты, которые нас вполне устраивают, в SQL Management Studio
Нюансы.
Бонус, тем, кто дочитал до конца.
Обращаю внимание, что Pre/Post-deployment скрипты работают только из того, проекта, который вы в данный момент публикуете. Т.е. Post-Deployment script из проекта DevDb не сработает, при публикации ProdDb.
Update от 06.12.2013:
Reference Database так же не наследуются от родительского проекта, и должны быть прописаны в наследниках.
Update от 09.12.2013 от Владимира Ладыгина:
Для проекта наследника можно подключить Post-Deployment script из родительского проекта путем добавления Add existing item (As linked). Поэтому здесь, все достаточно хорошо.
Можно конечно хранить все в одном проекте, и перед очередной публикацией добавлять/убирать комментарии или включать/выключать скрипты из build. Но чуть подумав, я вроде нашел способ лучше и изящнее.
Еще в Visual Studio 2010 существовало такое понятие, как Composite Database Project, попробуем применить данный подход для решения стоящей перед нами задачей, а именно просто унаследуем производственную базу данных от базы данных разработчиков.
Для проверки этой идеи сделаем простейший тест.
Шаг 0. Подготовительный
Создаем на сервере две пустых базы данных:
DevDb - база данных разработчиков
ProdDb - производственная база данных.
DevDb должна содержать две таблицы: tab1 и tab3, имеющих очень простую структуру (для теста нам этого будет достаточно): [Id] INT NOT NULL. tab1 и tab3 - это нормальные таблицы, участвующие в разработке.
ProdDb, в отличие от DevDb должна содержать дополнительную таблицу tab2 (структура таблиц для нас не важна, главное их наличии) с похожей структурой. tab2 - это таблица специфичная только для производственной базы данных и не имеющая к отношения к разрабатываемому продукту.
Создаем пустой solution.
Добавляем Database project для базы данных разработчиков: DevDb
В проект добавляем две таблицы, скрипты таблиц ниже:
Строим проект (Build)
Добавляем в solution проект производственной базы данных ProdDb
В проект добавляем таблицу tab2
И теперь наследуемся от проекта DevDb, добавляя его в Database References.
Обязательно указывая Database Location: Same database
Шаг 2. Публикация баз данных
Публикацию баз данных производим штатным образом, естественно каждый проект имеет собственную строку подключения
База данных разработчиков |
Производственная база данных |
Нюансы.
Бонус, тем, кто дочитал до конца.
Обращаю внимание, что Pre/Post-deployment скрипты работают только из того, проекта, который вы в данный момент публикуете. Т.е. Post-Deployment script из проекта DevDb не сработает, при публикации ProdDb.
Update от 06.12.2013:
Reference Database так же не наследуются от родительского проекта, и должны быть прописаны в наследниках.
Update от 09.12.2013 от Владимира Ладыгина:
Для проекта наследника можно подключить Post-Deployment script из родительского проекта путем добавления Add existing item (As linked). Поэтому здесь, все достаточно хорошо.
Комментариев нет :
Отправить комментарий