Страницы

пятница, 19 февраля 2016 г.

Работа в SSDT проектах с внешними базами

Ведение проектов баз данных в Visual Studio с использование SSDT удобный и мощный механизм, но здесь присутствуют свои нюансы использования, при ведении проектов сложных и комплексных баз данных, имеющих зависимости на внешние источники (например, сторонние базы данных на связанных серверах Linked Servers).

Данный материал подготовлен практически для внутреннего использования, чтобы не читать лекцию новичкам, начинающим работу над проектами баз данных.
Рассмотрим два основных случая:
  • Две базы данных, одна из которых имеет зависимость от другой.
  • Две базы данных имеющих циклическую зависимость

Две базы данных с односторонней зависимостью

Самый простой и легкий случай.

Подготовка

Для проведения работ подготовлены две базы данных:
Первая база данных (db1):
Таблицы:
Представления:
Процедуры:
Вторая база данных (db2)
Процедуры
Представления: Базы данный создавались с помощь Management Studio, но это неважно, они могли создавать сразу в рамках проекта. Обе базы данных находятся на одном сервере, но это не принципиально, почему покажу ниже.
Работы проводились с использование Visual Studio 2015, с установленной последней версией SSDT.

Проекты баз данных в рамках одного solution

Стандартную работу с проектом базы данных рассматривать не буду, только исполняемые шаги, которые позволят повторить производимые действия
  • Создаем пустой solution OneWayDependence1
  • Добавляем проект базы данных Db1
  • Производим импорт структуры из реальной базы данных db1 (можно просто создать объекты в рамках проекта)
  • Добавляем проект базы данных Db2
  • Производим импорт структуры из базы данных db2
После этих действий, у нас получится примерно такая структура solution:

Попытка построить solution заканчивается неудачей
Как видим, компилятор не может разрешить ссылки на внешние объекты в Db2, для исправления этой ситуации необходимо добавить в проект Db2 ссылку на проект Db1

/div>
И изменить процедуры и view приподящие к ошибкам, изменив прямые ссылки на внешние ресусры, переменными созданными при добавлении ссылки на проект Db1
Если бы базы данный располагались на разных серверах, то при добавлении ссылки надо было для Database location установить Different database, different server

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

Проекты баз данных в разных solution (или проект одной БД недоступен)

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

Для рассмотрения данного случая создадим еще один solution OnewayDependence2, который будет содержать только Db2 и ничего не будет знать о базе данных Db1.

Структура проекта будет иметь примерно такой вид:


Ошибки аналогичны видимым нами ранее. 
Разрешение проблемы аналогично, но только в этом случае внешняя база данных (Db1) добавляется как пакет, содержащий Data-tier Application.

DAC пакет для Db1 подготовим в Management Studio



Добавляем ссылку на пакет Db1 в проект Db2



Вносим изменения в скрипты, аналогично предыдущим изменениям.

В результате имеем нормально компилирующийся проект, готовый к публикации

Циклически зависимые базы данных

Более сложный случай, если базы данных имеют взаимные зависимости.
Для этого создадим две базы данных, практически идентичные первой части, но в этом случае у нас добавится зависимость Db1 от Db2 
Добавленные изменения относительно первоначальной версии:
Первая база данных (Db1):
Таблицы

Представления

Процедуры


Вторая база данных (db2)
Таблицы

Представления

Процедуры

Делаем solution и добавляем туда два проекта.


Ожидаемо, компиляция solution не проходит
Db1 имеет неизвестные ссылки на Db2


Db2 имеет неизвестные ссылки на Db1


Пробуем добавить ссылки на проект базы данных, в рамках одного solution. Visual Studion не позволяет это делать, сообщая о циклической ссылке между проектами.


Как вывод: необходимо подключать reference database как DAC пакет.

Пытаемся создать DAC пакет для db1 в Management Studio, и терпим неудачу, т.к. Management Studio тоже не может разрешить внешние ссылки.


Тут самое время, начать рвать волосы и заняться созданием mock проектов. Т.е., например, в solution с проектом db2 добавить не реальный проект db1, а проект содержащий пустышки, которые описываю внешние интерфейсы используемых ресурсов - это грустно.

Но, еще почитав MSDN, находим замечательную утилиту SqlPackage.exe входящую в поставку SQL сервера и находящийся по следующему пути:
C:\Program Files (x86)\Microsoft SQL Server\<sql version>\DAC\bin\SqlPackage.exe 

С его помощью производим выгрузку DAC пакетов для обеих баз данных.
Пример вызова для db1 
За подробностями о утилите, добро пожаловать в MSDN.

Подготовив таким образом пакеты для обеих баз данных, подключаем их к соответсвующим проектам db1.dacpac к проекту Db2 и db2.dacpac к Db1

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

Выводы:
Скорее всего при большом количестве баз данных и сложных взаимосвязях между ними удобвнее держать общий файловый репозиторий (переодически обновляемый) Data-tired application. А каждую базу вести в отдельном solution. Связи между проектами баз данных, в рамках одного solution, использовать для организации наследования, см. Ведение проекта базы данных разработчиков и проекта производственной базы данных в Visual Studio 2012





Комментариев нет :

Отправить комментарий