Документация

Обзор

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

Основанный на заданиях

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

SQL Server синхронизация структуры базы данных. Функциональная схема  MS SQL синхронизация структуры базы данных. Задание

Проектно-ориентированный

AutosyncDB имеет нестандартную проектную архитектуру, в которой задания выполняют роль проекта. Сам же файл проекта содержит значения настроек задания по умолчанию. Вы можете создать несколько заданий для проекта и сохранить любое из них как этот проект или как новый. У каждого задания есть своя копия настроек проекта. Они не пересекаются, но все ссылаются на один и тот же каталог проекта. Еще в проекте предусмотрен каталог вывода с вложенными каталогами для результатов. Каждый такой подкаталог называется именем своего задания, поэтому они также не пересекаются, но имена заданий должны быть уникальными в рамках проекта.

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

На рисунках ниже показан пример двух проектов в одном каталоге Project1 с пятью открытыми заданиями и каталогами результатов, два для Project1-config1 и три для Project1-config2.

Пример структуры каталогов проекта AutosyncDB  Пример панели представления проектов в AutosyncDB

Сравнение и синхронизация схем баз данных

Сравнение и синхронизация настраиваются путем указания действий, таких как Создавать, Изменять, Пересоздавать, Удалять, которые разрешено выполнять с объектами определенной категории, а также других настроек. Эти настройки используются алгоритмом сравнения для сравнения схем баз данных и построения протокола синхронизации вместе с моделью различий. Если для устранения различий над объектом требуется выполнить какое-либо действие, и это действие разрешено для категории объекта, – то оно будет ему установлено. AutosyncDB сообщает о различиях для каждого объекта в контексте этих действий, вместе с результатом сравнения и причиной для первого действия.

Другими важными настройками синхронизации являются – Развязывать зависимости и Устранять конфликты. Они говорят алгоритму, что нужно раскручивать цепочки взаимозависимых объектов путем их пересоздания, а также удалять конфликтующие объекты. В большинстве случаев, чтобы получить правильный скрипт синхронизации, необходимо использовать настройку Развязывать зависимости, иначе жесткие зависимости между некоторыми объектами могут помешать их изменению, а дочерние объекты, чьи родители пересоздаются, могут быть потеряны.

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

На основе протокола синхронизации и модели различий AutosyncDB строит отчеты: дерево различий, которое показывает составной список объектов обеих баз данных в контексте действий и результатов их сравнения; отчет в формате Excel, представляющий собой протокол синхронизации; SQL-скрипт синхронизации для целевой базы данных как своего рода отчет, основанный на протоколе синхронизации и данных о зависимостях объектов.

На рисунках ниже показаны две панели Различий. Первая для задания, настроенного для синхронизации схем баз данных, а вторая – для сравнения. Задание синхронизации не предполагало удаления объектов, отсутствующих в шаблонной базе данных, но позволяло разрешать зависимости и конфликты. Вместо этого в задании сравнения были разрешены все действия, кроме групповых (Пересоздать Все, Удалять дубликаты), но зависимости и конфликты не разрешались.

Панели Различия для заданий синхронизации и сравнения
SQL Server синхронизация структуры данных. Панель Различия задания синхронизации  SQL Server сравнить схемы базы данных. Панель Различия задания сравнения

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

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

Возможности сравнения и синхронизации схем баз данных

AutosyncDB работает с базами данных онлайн и файлами. Он использует представления каталога sys. для загрузки и кеширования структуры баз данных при каждом запуске задания.

AutosyncDB кросс-серверный и кросс-версионный. Например, вы можете синхронизировать структуру базы данных на SQL Server 2005 со структурой базы данных на SQL Server 2022 или наоборот. Конечно, если вы используете какой-то новый функционал, который не поддерживается в 2005-м, то получите соответствующие ошибки от движка SQL во время выполнения скрипта.

AutosyncDB всегда сравнивает имена сущностей базы данных согласно COLLATION, а вот сравнение тела объектов и вычисляемых выражений можно донастраивать. Если установлена опция Изменять COLLATION базы данных, то алгоритм сравнения будет использовать параметры сравнения шаблонной базы данных, в противном случае – целевой.

Приложение обеспечивает поддержку сравнения и синхронизации не только объектов базы данных, но и их различных параметров, таких как например ANSI_NULLS, ANSI_PADDING, DATA_COMPRESSION, ONLINE, PAD_INDEX, IGNORE_DUP_KEY, STATISTICS_INCREMENTAL, ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, BUCKET_COUNT и многих др. В зависимости от конфигурации задания, их значения могут быть как унаследованы от значений в целевой базе данных, так и изменены на значения из шаблонной. Во многих случаях необходимость такого изменения может даже привести к необходимости пересоздания самих объектов, с чем приложение также успешно справляется.

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

Показать различия объектов между двумя схемами

AutosyncDB имеет встроенную поддержку визуализации различий объектов после сравнения. Она доступна по каждому объекту через панель Различия. Также через нее можно просмотреть и скрипт синхронизации объекта, если таковой был нужен.

На рисунке ниже показаны различия между схемами таблиц dbo.SYS2. Этот результат был взят из приведенного выше примера с двумя заданиями, а именно для задания синхронизации. Алгоритм сравнения выяснил, что таблица была изменена, и действие Пересоздать необходимо для приведения в соответствие порядка следования колонки IdExt. Также нужно добавить колонку PasswordHash. Примечательно, что если бы для задания не была установлена опция Таблицы \ Порядок столбцов, то таблицу можно было бы изменить, просто используя оператор ALTER, без необходимости в пересоздании.

Пример документа Различий объектов
Показать различия объектов между двумя схемами SQL Server

Перенести данные

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

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

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

Пример файла описания переносимых данных
<?xml version="1.0" encoding="utf-8"?>
<root>

	<!-- Просто добавить записи, которых нет в шаблоне -->
	<merge schema="dbo" name="UserAuthMethods" />

	<!-- Сделать данные одинаковыми, не переносить значения IDENTITY, отключать триггера, сравнивать по CatId -->
	<merge schema="SalesDept" name="PropertyCategories" upd="1" del="1" tgoff="1" iioff="1" mcond="t.CatId = s.CatId" />

	<!-- Синхронизировать объекты приложения, но только указанные колонки, не трогать объекты, определенные пользователем,
		изменять все без разбору (не сравнивать значения всех изменяемых колонок в условии инструкции update) -->
	<merge schema="app" name="main_factory_objects" upd="1" del="1"
		cols="[path], is_app_shipped, [class], name, [content]"
		scond="ISNULL(is_app_shipped,0) = 1"
		dcond="ISNULL(t.is_app_shipped,0) = 1"
		ucond="--"
	/>

</root>

Технология поддерживает все встроенные типы данных, а также типы данных, определяемые пользователем, включая CLR. Умеет обрабатывать некоторые баги с типом данных xml, умеет использовать OPENQUERY для работы с таблицами в памяти и связанными серверами.

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

Экспорт структуры базы данных в файл

AutosyncDB реализует собственный сжатый формат файла .audbs для хранения структуры базы данных и переносимых данных. Нет никакой разницы между экспортом целевой или шаблонной базы данных. Сам экспорт выполняется как задание по команде.

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

Не используйте файлы структуры базы данных и файлы пакетов в качестве единственной копии структуры и предопределенных данных в архиве версий. Всегда имейте резервную копию самой базы данных и/или SQL-скрипты (DDL) для ее создания.

Создание пакета обновления базы данных

Любое задание можно экспортировать в файл пакета, который AutosyncDB может запускать в режиме Мастера пакетов или в фоновом режиме. Кроме того, файл пакета можно экспортировать обратно как проект. Для этих целей AutosyncDB реализует формат файла .audbp, который является расширенной версией .audbs. Сама же сборка выполняется как задание по команде.

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

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

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

Пример Мастера пакетов обновления базы данных
Мастер развертывания изменений базы данных SQL Server

Утверждение целевой базы данных

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

Пример скрипта утверждения целевой базы данных
BEGIN TRY
	-- Похожа на нашу? Проверим некоторые основные объекты
	IF OBJECT_ID(N'[dbo].[SYS2]', 'U') IS NULL OR OBJECT_ID(N'[dbo].[Schemas]', 'U') IS NULL OR OBJECT_ID(N'[dbo].[SYS_KernelVersion]', 'U') IS NULL
		INSERT INTO #autosyncdb_target_approval(result_code) SELECT 2;

	-- Это та конфигурация? Проверим некоторые характерные объекты
	ELSE IF OBJECT_ID(N'[dbo].[DOC310]', 'U') IS NULL
		INSERT INTO #autosyncdb_target_approval(result_code) SELECT 3;

	-- Версия должна быть больше или равна 4.58
	ELSE IF CONVERT(hierarchyid, '/' + ISNULL((SELECT TOP 1 VersionString FROM [dbo].[SYS_KernelVersion] WITH(NOLOCK)), '') + '/') < CONVERT(hierarchyid, '/4.58/')
		INSERT INTO #autosyncdb_target_approval(result_code) SELECT 4;

	-- Версия должна быть меньше 4.61
	ELSE IF CONVERT(hierarchyid, '/' + ISNULL((SELECT TOP 1 VersionString FROM [dbo].[SYS_KernelVersion] WITH(NOLOCK)), '') + '/') >= CONVERT(hierarchyid, '/4.61/')
		INSERT INTO #autosyncdb_target_approval(result_code, result_code_desc) SELECT 5, 'The target database should be version 4.58 till 4.60 for this update.';

	-- Допустим, наличие столбца Name говорит нам о некоторых скриптах, которым следовало быть выполненным ранее
	ELSE IF NOT EXISTS(SELECT TOP 1 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[DOC310]', 'U') AND name = N'name')
		INSERT INTO #autosyncdb_target_approval(result_code) SELECT 6;

	-- Успешно, можем выполнять задание
	ELSE
		INSERT INTO #autosyncdb_target_approval(result_code) SELECT 0;

END TRY BEGIN CATCH
	-- Что-то пошло не так
	INSERT INTO #autosyncdb_target_approval(result_code) SELECT 1;
END CATCH;

Совместимость

AutosyncDB совместим с SQL Server 2005 по 2022 и поддерживает все наиболее часто используемые функциональные возможности. Генерация кода спроектирована таким образом, чтобы результирующий SQL-скрипт был совместим с самой младшей поддерживаемой версией – 2005. В некоторых случаях генератор может проверять версию сервера целевой базы данных, чтобы предоставить более эффективный скрипт.

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

Обратитесь к разделу настроек Тестировать на совместимость здесь Сравнение схем двух баз данных SQL Server и здесь Совместимость, чтобы узнать больше.

Интеграция

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