Plugin for HANA Database project in Visual Studio

в 14:06, , рубрики: .net, hana, tfs, Visual Studio

Я работаю по SCRUM-у в ASP .NET MVC-проекте, в котором HANA используется как база данных, а в качестве Source Control-а – TFS. На уровне базы данных преимущественно используем View (Calculation, Attributes and DB Views), а также Stored Procedure – для выполнения транзакционных запросов на сервер.

После окончания каждого релиза у меня всегда возникал вопрос: «А что именно изменилось в этом релизе?» или «Кто какое изменение сделал?» В связи с этим я подумал: «Почему бы не трекать состояние объектов в TFS после каждого изменения?»

В результате я решил создать плагин, который позволяет использовать Database-проект в Visual Studio (VS) и импортировать изменения, которые есть в базе данных. Так родилась идея создания данного приложения.

Начинаем с простого и смотрим, какие прототипы есть у Microsoft. Как пример возьмем MS-SQL-сервер и Database-проект в Visual Studio и рассмотрим все возможности, которые у них существуют:

  1. Можно создать свою схему (использовать существующую) в MS-SQL и потом импортировать ее в Database-проект в Visual Studio (DB VS).
  2. Можно создать (изменить) объект в Database и трансформировать изменения в базу данных.
  3. Можно трекать изменения в Source Control (в моем случае в TFS).
  4. Таким образом, мы можем отслеживать все изменения, которые происходят в ходе разработки, а также их авторов.

Сразу говорю, что поддерживать все эти возможности очень непросто, тем более что в HANA существует такой вид объектов, как Graphic View: он создается в графическом виде и его никак не продемонстрируешь в Visual Studio (но тем не менее для этого типа объектов тоже нашелся подход, чтобы импортировать его в VS).

Я пошел по простому пути. Рассмотрим каждую возможность по отдельности.

Создание/использование схемы в HANA и импорт ее в DB VS

Тут есть две задачи:

  1. Создать проект с нуля в DB VS и импортировать его в DB.
  2. Использовать уже существующий проект (схему) в DB и импортировать его в DB VS.

Я выбрал только вторую: во-первых, у меня уже есть существующий проект, во-вторых, для создания проекта в VS необходима обратная связь (о ней я буду говорить чуть позже), которая является очень непростой задачей.

Итак, я должен создать мост, который импортирует все объекты из DB в DB VS.

Создание (изменение) объекта в Database и трансформирование изменений в базу данных

Это почти то же самое, что и в предыдущей задаче. То есть если у меня уже есть существующая схема, надо только принести объекты в DB VS. Однако здесь стоит учитывать: если измененный (удаленный) объект уже существует в проекте, следует его редактировать (удалить) в DB VS. Это необходимо для того, чтобы трекать изменения в TFS, поэтому я тоже реализовал эту задачу.

Возможность трекать изменения в Source Control (в моем случае в TFS)

После того, как появились изменения в DB VS, надо трекать их в TFS. Для этого каким-то образом надо в VS отметить измененные файлы так, чтобы она вошли в список айтемов для Check-In. Тут мне пришлось использовать «.New framework libraries» для TFS. Я использовал Visual Studio 2012 во время создания данного плагина, но для других (высших) версий VS надо использовать необходимые (дополнительные) framework-и от Microsoft, чтобы плагин мог занести изменения в TFS.

DB VS Plugin

Плагин состоит из 4-х основных частей:

  1. Authentication Window.
  2. HANA Object Transformer.
  3. Object Changes Manager.
  4. TFS Manager.

Authentication Window

В данное окно мы вводим всю необходимую информацию для нашего плагина. После того как проверка прошла успешно, система запоминает данные и при следующем логине их использует. Если по какой-либо причине плагин не смог «достучаться» до одного сервера (например, после изменения своих прав в DB или в TFS), то снова открывается окно авторизации и дает возможность редактирования свои прав.

Plugin for HANA Database project in Visual Studio - 1

Нам необходимо внести два типа данных:

  1. Всю необходимую информацию для HANA, а именно: Server Path, User Name, Password и Schema Name.
  2. Информацию о проекте и TFS: в поле Project Path можно показать местонахождение DB VS-файла для использования в плагине. Также информацию о TFS Credential, такую как User Name, Password и TFS Server URL.

Если вы поставите галочку возле Save, то после успешного подключения к серверам ваши данные сохранятся.

HANA Object Transformer

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

  1. Tables.
  2. Constraints (Foreign Keys, Primary Keys, Unique).
  3. Table Types.
  4. Sequences.
  5. Functions.
  6. Stored Procedures.
  7. Synonyms.
  8. Views (Attribute Views, Calculation Views, Database Views).

Знаю, что в HANA многие проекты используют еще и другие объекты (как REST Services (XSJS) и т.д.), но в нашем случае мы их игнорировали. Для всех объектов, кроме Views, я использую системные словари, чтобы получить данные. Как пример рассматриваем получение данных о таблицах.

Для этого получаем название таблиц в нашей схеме с помощью следующего запроса:

SELECT 
	SCHEMA_NAME,TABLE_NAME,TABLE_OID,COMMENTS,FIXED_PART_SIZE,IS_LOGGED,IS_SYSTEM_TABLE,IS_COLUMN_TABLE,TABLE_TYPE,IS_INSERT_ONLY,IS_TENANT_SHARED_DATA,IS_TENANT_SHARED_METADATA,SESSION_TYPE,IS_TEMPORARY,TEMPORARY_TABLE_TYPE,COMMIT_ACTION,IS_USER_DEFINED_TYPE,HAS_PRIMARY_KEY,PARTITION_SPEC,USES_EXTKEY,AUTO_MERGE_ON,USES_DIMFN_CACHE,IS_PUBLIC,AUTO_OPTIMIZE_COMPRESSION_ON,COMPRESSED_EXTKEY,HAS_TEXT_FIELDS,HAS_TEXT_FIELDS,USES_QUEUE_TABLE,IS_PRELOAD,IS_PARTIAL_PRELOAD,UNLOAD_PRIORITY,HAS_SCHEMA_FLEXIBILITY,IS_REPLICA
FROM TABLES
WHERE SCHEMA_NAME = CURRENT_SCHEMA AND IS_USER_DEFINED_TYPE = 'FALSE'; 

После чего получаем данные о колонках таблиц с помощью следующего запроса и в C# коде с помощью Linq объединяем их:

SELECT 
	SCHEMA_NAME, TABLE_NAME, TABLE_OID, COLUMN_NAME, POSITION, DATA_TYPE_ID, DATA_TYPE_NAME, OFFSET, LENGTH, SCALE, IS_NULLABLE, DEFAULT_VALUE, COLLATION,COMMENTS, MAX_VALUE, MIN_VALUE, CS_DATA_TYPE_ID, CS_DATA_TYPE_NAME,DDIC_DATA_TYPE_ID, DDIC_DATA_TYPE_NAME, COMPRESSION_TYPE, INDEX_TYPE, COLUMN_ID, PRELOAD,GENERATED_ALWAYS_AS, HAS_SCHEMA_FLEXIBILITY, FUZZY_SEARCH_INDEX, FUZZY_SEARCH_MODE,MEMORY_THRESHOLD,LOAD_UNIT,GENERATION_TYPE
FROM TABLE_COLUMNS WHERE SCHEMA_NAME = CURRENT_SCHEMA ORDER BY POSITION

Самым сложным оказалось получить информацию о Graphic Attribute View. Тут нет прямой возможности получить данные о структуре View. Но если подумать, HANA Studio показывает эту графическую вьюшку с помощью определенных метаданных в базе. Я тоже старался получить именно эти метаданные, а нашел на XML файл, который для каждого View сохраняется в DB. Таким образом я решил этот вопрос: то есть чтобы получить информацию о вьюшке и также трекать ее изменения, мне необходимо сохранить ее XML в DBVS. В структуре XML существует такие данные, как входящие параметры, исходящие параметры, наименования всех таблиц, которые используются в текущей вьюшке, тип данных, фильтры, join-ы и еще много чего интересного.

Calculation / Database Views тоже в основном создаются и сохраняются как SQL Script, поэтому тут особых проблем не возникало.

Object Changes Manager (OCM)

После получения информации с базой надо посмотреть, какое изменение есть в текущем и в предыдущем состояниях DB VS. OCM является звеном синхронизации изменений и синхронизует DB VS в трех этапах:

  1. Проверяет, какие новый объекты были добавлены в схеме.
  2. Проверяет наличие изменений в каждом существующем объекте.
  3. Проверяет удаление объектов в схеме.

В первом случае: OCM генерирует скрипт, добавляет файл, определяет местонахождение в DB VS и обновляет дополнительные файлы.

Во втором случае: OCM сравнивает сгенерированный скрипт с существующим файлом в DB VS и, если объект изменился, меняет существующий файл.

В третьем случае: OCM удаляет файлы объектов, которые отсутствуют в текущей версии схемы.

Ниже представлены скриншоты, которые показывают, как выглядит окно плагина и как происходит процесс миграции:

Plugin for HANA Database project in Visual Studio - 2
Рис. 1. Список объектов (в данном случае таблицы), которые изменились

  • красный цвет – удаленные айтемы,
  • зеленый – новые,
  • фиолетовые – измененные


Plugin for HANA Database project in Visual Studio - 3
Рис 2. Список Stored Procedure, которые изменились

Plugin for HANA Database project in Visual Studio - 4
Рис. 3. В Included окне входит список набранных объектов для изменения в DB VS

Plugin for HANA Database project in Visual Studio - 5
Рис. 4. Вопрос на принятие изменения в DB VS

Plugin for HANA Database project in Visual Studio - 6
Рис. 5. Идет процесс миграции в DB VS

Plugin for HANA Database project in Visual Studio - 7
Рис. 6. Сообщение об успешном выполнении миграции

TFS Manager Service (TFS MS)

TFS MS следит за каждым изменением, которое происходит в проекте, и отмечает их соответствующим образом: чтобы при Check-In все они попали в список измененных айтемов в TFC.

С помощью данного плагина мне удалось трекать все изменения в рамках нашего проекта. Я двигался дальше и расширил этот плагин для Merge Delivery Unit в разных схемах, а также для сравнения разных схем после процесса мерджа, чтобы убедиться, что все смерджилось правильно. Но об этом я расскажу в следующей статье

Автор: Peiman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js