Руководство

Введение
Начинаем работу
Представление объектов БД в виде файлов
Специальные объекты проекта БД
Перенос данных в таблицах
Свойства проекта
Развертывание проектов

Введение

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

Поддержка схемы БД в актуальном состоянии на продакшн сервере, особенно когда изменения идут от более чем одного разработчика, это всегда настоящая «головная боль» для тех, кто за это отвечает. Как правило разработчики пишут некие «incremental updates», а специальный человек пытается совместить их все вместе и при этом ничего не сломать. Иногда это даже получается.

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

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

Полученный набор текстовых файлов, может быть сохранен в используемой разработчиками Системе Контроля Версий. И в дальнейшем у нас всегда будет ответ на важнейшие вопросы КТО и ЧТО ИМЕННО сделал два года назад в БД что все сейчас упало. А если политика чекинов предусматривает обязательное заполнение поля комментарий – то и с какой целью это было сделано. А, как известно, в разработке корпоративного ПО вопрос «зачем это было сделано и кому оно сейчас нужно» является одним из самых сложных.

Кроме схемы объектов БД также поддерживается синхронизация данных из таблиц. Это позволяет поддерживать различные данные, необходимые для работы клиентского ПО или различные справочные данные, в актуальном для данной версии БД состоянии.

dbProjector поддерживает ведение проектов для следующих СУБД:

  • Microsoft SQL Server – от 2008 до 2016 всех редакций
  • PostgreSQL – от 9.1 до 9.6 всех редакций

DbProjector для своей работы требует только наличия .NET Framework 4.5 (входит в состав всех современных версий Windows), или Mono (http://www.mono-project.com/) для Linux систем.

На стороне клиента, для создания новой БД или обновления версии существующей БД, используется отдельная утилита dbpDeploy. Он существует в виде двух версий:

  • dbpDeploy.exe – консольное приложение в котором все опции установки задаются параметрами командной строки
  • dbpDeployGui.exe – GUI приложение по типу мастера где пользователь в интерактивном режиме может задать параметры обновления БД (как например имя сервера и параметры авторизации)

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

 

Начинаем работу

Работа с DbProjector начинается с создания нового проекта через пункт меню «File → New Database Project» где необходимо выбрать тип БД (MSSQL Project или PostgreSQL Project), имя базы данных (это имя будет использоваться в DbProjector Installer), и наименование проекта БД.

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

Скрипты, генерируемые DbProjector, не есть простые текстовые файлы, но их можно просматривать в текстовом редакторе, и в дальнейшем сравнивать через Diff используемой у вас системы контроля версий.

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

  • Получение последней версии проекта
  • Синхронизация локальной БД разработчика с проектом БД (Tools → Export Schema to Database)
  • Создание или редактирование любых объектов на локальной БД из любого удобного разработчику средства (EM, QA, pgAdmin и т.д.)
  • Импортирование изменённых объектов БД в проект (Tools → Import Schema to Project)
  • Сохранение изменённых объектов проекта в систему контроля версий.
    (Перед этим лучше убедится что вносимые вами изменения могут быть отработаны в принципе. Например, если добавить в существующую таблицу столбец NOT NULL без Default, при реальном Deploy на стороне клиента такая инструкция естественно не сможет быть выполнена без специальных ухищрений)

 

Представление объектов БД в виде файлов

Каждый объект БД первого уровня (это объекты БД, не имеющие родительского объекта, как-то: таблицы, процедуры и т.д. и напротив, объекты второго уровня, колонки в таблицах, ключи, индексы, гранты – имеют родителя, они всегда относятся к какой-либо таблице или другому объекту такого уровня) представляется одним файлом в который также включаются все дочерние объекты, которыми обладает данный объект. Т.е. в одном файле с определением, например таблицы, сохраняются также все объекты ей принадлежащие: колонки, ключи, ограничения, индексы, гранты и т.д. и выступают единой единицей хранения.

При деплое (здесь и далее – процесс синхронизации объектов реальной БД с версиями объектов проекта БД) проекта на реальную БД устанавливается соответствие объектов в проекте с тем, что есть в БД.

Устанавливаются следующие категории соответствий:

  • Есть только в проекте. Значит, надо будет выполнить в БД полную команду создания такого объекта.
  • Есть и там и там, но объекты различны по любому признаку. Необходимо будет сгенерировать такой SQL-скрипт для модификации данного объекта на БД, который приведёт его в соответствие с тем видом который есть в проекте.
  • Есть и там и там, и объекты идентичны. Ничего делать не требуется.
  • Объект существует только в БД. Сгенерировать команду удаления такого объекта.

Нужно понимать, что приведение одной схемы БД (в данном случае сохраненной в виде проекта БД) к другой, которая сейчас имеется на БД – процесс нетривиальный. Существует много зависимостей между объектами БД. Например, вы не сможете создать Foreign Key на таблицу которая еще не была создана к данному моменту и подобных правил множество.

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

Практически со всеми такими ситуациями DbProjector способен справляться сам, в реальном времени, в зависимости того что обнаружено на целевой БД.

Но также есть и другие факторы, которые надо иметь в виду, с которыми DbProjector сам справиться не в состоянии. Например, если разработчик добавляет новый столбец в существующую таблицу со спецификатором NOT NULL и не определяет DEFAULT. Такая инструкция разумеется вызовет исключение и все выполненные в рамках транзакции инструкции по обновлению будут отменены.

 

Специальные объекты проекта БД

В проекте БД могут существовать и другие объекты которые не порождаются импортом схемы БД, а разработчик создает их сам через оболочку DbProjector и они существуют только в рамках самого проекта БД. Это такие объекты как DeplymentScript и TableData.

DeploymentScript – это произвольный набор SQL инструкций, которые выполняются до чтения схемы БД (BeforDeploy) или после основного деплоя (PostDeploy). Основное использование – это осуществление действий с БД не поддерживаемых непосредственно DbProjector. Например, осуществление каких бы то ни было проверок, требуемых по бизнес логике или совершение действий над схемой БД. Так, удаление identity из уже существующей таблицы с последующей заменой на Sequence можно организовать через BeforDeploy скрипт пересоздания столбца с сохранением в нем существующих данных (попутно грохнув также ссылающиеся на него «Foreign Key»). На следующей стадии сравнения схем БД будут сгенерированы все необходимые инструкции по восстановлению недостающих связей и созданию нового Sequence.

Замечание: При выполнении команды «Export» из IDE DbProjector выполнения BeforDeploy|PostDeploy скриптов не осуществляется. Для их выполнения можно воспользоваться DbProjector Installer или, что тоже самое, через команду меню «Tools → Deploy Solution».

 

Перенос данных в таблицах

Кроме схемы объектов БД, важную часть БД составляет наполнение таблиц данными, без которых клиентское ПО будет просто не в состоянии работать. Это данные для инициализации объектов ПО или различные справочники.

Поддержка распространения данных в таблицах осуществляется через объект DataTable. Создать его можно через команду меню «Project → Create Object → Table data …». В открывшемся диалоговом окне необходимо выбрать имя таблицы для которой создается объект. Созданный объект будет является отдельным объектом, но его структура берется из объекта таблицы при его создании. Работа объекта DataTable зависит от ряда настроек.

Table rows copy type – тип копирования. Существуют следующие режимы:

  • Add new rows on table create – копировать данные из проекта при создании таблицы (всегда включено)
  • Add new rows on database update – добавлять в таблицу новые записи при обновлении
  • Rewrite existing rows – обновлять уже существующие записи в таблице на стороне клиента, данными из проекта. Записи сопоставляются по первичному ключу (Primary key) который должен быть определен для таблицы.
  • Delete absent rows – удалять записи в таблице клиента которых нет в проекте. Сопоставление также происходит по Primary key.

Для режима Rewrite existing rows существует также расширенная настройка Rewrite columns – список кольюмов которые необходимо обновлять.

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

Если же включить только Add new rows on database update, то по первичному ключу будут выявляются отсутствующие у пользователя записи и на БД клиента будут копироваться только новые записи созданные разработчиком и никак не затрагиваться уже созданные или модифицированные клиентом.

Необходимо также заметить, что если есть зависимости в таблицах по Foreign key то зависимые данные также скорей всего потребуется включать в проект. Очередность добавления, изменения, удаления данных выстраивается автоматически в зависимости от реальной схемы БД у клиента при деплое.

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

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

 

Свойства проекта

Свойства текущего проекта доступны через пункт меню «Project → Project Properties».

На первой вкладке стоит пояснить пункт «Project Version». Это специальный объект, создаваемый DbProjector при создании проекта БД. Технически это функция БД «dbprojector_version» которая возвращает установленную версию проекта. Вещь крайне полезная, настоятельно рекомендуется аккуратно ее увеличивать по ходу развития проекта.

Вкладка «Ignore» содержит список объектов, которые будут игнорироваться при любых операциях экспорта импорта. Можно использовать для отсева ненужных в проекте объектов БД, каких-либо системных объектов, объектов, которые вы не намереваетесь тащить с БД разработчика к клиенту, а также, клиентские объекты, которые вы не хотите затрагивать по тем или иным причинам (можно добавлять по маске).

 

Развертывание проектов

Для развертывания проектов на стороне клиента служат приложения:

  • dbpDeploy.exe – консольное приложение
  • dbpDeployGui.exe – GUI мастер

С помощью этих приложений можно создать новую БД, или обновить существующую. Эти приложения работают с так называемыми установочными пакетами проектов. Получить такой пакет можно выполнив из IDE dbProjector команду «Tools → Publish Deploy Pack». Результатом выполнения этой команды, в папке «$Home/dbProjector/DeployPacks/» будет файл «ProjectName.dbpack».

Пакет представляет собой zip архив всех файлов, входящих в проект. Для выпуска пакета необходимо получить цифровую подпись проекта. Подпись проекта осуществляется программно, через обращение к API сайта https://dbprojector.net. На сайт при этом передается только вычисляемая контрольная сумма проекта и Guid проекта который можно увидеть в свойствах проекта из IDE dbProjector.

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

Все произведенные с БД действия в dbpDeploy логируется в папке:

  • Для Windows – %HOMEPATH%\Documents\dbProjector\Logs
  • Для Linux – $HOME/dbProjector/Logs

Список параметров командной строки для dbpDeploy:

  • +create – флаг, указывающий что БД должна быть создана. Выполнится инструкция CREATE DATABASE со всеми параметрами по умолчанию. Если указанная БД уже существует возникнет ошибка и процесс остановится.
  • -dbpack – задание пути и имени пакета проекта («ProjectName.dbpack»).
  • -host – имя хоста(а также Instance для MSSQL, порт для Pg) СУБД
  • -database – задается только если необходимо переопределить имя БД указанное в проекте.
  • -uid – логин БД с правами администратора СУБД.
  • -pwd – пароль.

Примеры:

Для MSSQL на Windows:
dbpDeploy.exe -dbpack "C:\DbProjects\TestDb1\TestDb1.dbpack" +create -host testserver1\sqlexpress -uid sa -pwd testpwd

Для PostgreSQL на Linux:
exec /usr/bin/mono dbpDeploy.exe -dbpack "/home/user1/dbProjector/Projects/TestDb1/TestDb1.dbpack" -host localhost:5432 -uid postgres -pwd testpwd

Примечание1: Если эти параметры задать для dbpDeployGui.exe то переданные значения сразу подставятся в соответствующие поля и в дальнейшем пользователь может или изменить их по своему усмотрению, или только нажимать кнопку «Далее».

Примечание2: Для работы dbpDeploy на Linux необходим установленный пакет mono. Для Debian, Ubuntu и деривативов для установки mono можно воспользоваться инсталятором dbProjector. Как установить mono для других дистрибутивов можно ознакомится по ссылке: http://www.mono-project.com/docs/getting-started/install/linux