Я работаю по 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 и рассмотрим все возможности, которые у них существуют:
- Можно создать свою схему (использовать существующую) в MS-SQL и потом импортировать ее в Database-проект в Visual Studio (DB VS).
- Можно создать (изменить) объект в Database и трансформировать изменения в базу данных.
- Можно трекать изменения в Source Control (в моем случае в TFS).
- Таким образом, мы можем отслеживать все изменения, которые происходят в ходе разработки, а также их авторов.
Сразу говорю, что поддерживать все эти возможности очень непросто, тем более что в HANA существует такой вид объектов, как Graphic View: он создается в графическом виде и его никак не продемонстрируешь в Visual Studio (но тем не менее для этого типа объектов тоже нашелся подход, чтобы импортировать его в VS).
Я пошел по простому пути. Рассмотрим каждую возможность по отдельности.
Создание/использование схемы в HANA и импорт ее в DB VS
Тут есть две задачи:
- Создать проект с нуля в DB VS и импортировать его в DB.
- Использовать уже существующий проект (схему) в 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-х основных частей:
- Authentication Window.
- HANA Object Transformer.
- Object Changes Manager.
- TFS Manager.
Authentication Window
В данное окно мы вводим всю необходимую информацию для нашего плагина. После того как проверка прошла успешно, система запоминает данные и при следующем логине их использует. Если по какой-либо причине плагин не смог «достучаться» до одного сервера (например, после изменения своих прав в DB или в TFS), то снова открывается окно авторизации и дает возможность редактирования свои прав.
Нам необходимо внести два типа данных:
- Всю необходимую информацию для HANA, а именно: Server Path, User Name, Password и Schema Name.
- Информацию о проекте и TFS: в поле Project Path можно показать местонахождение DB VS-файла для использования в плагине. Также информацию о TFS Credential, такую как User Name, Password и TFS Server URL.
Если вы поставите галочку возле Save, то после успешного подключения к серверам ваши данные сохранятся.
HANA Object Transformer
Эта самая сложная часть плагина. Тут, используя системные словари, мы получаем информацию о всех объектах, которые находятся в системе. Объекты, которые поддерживаем в текущей реализации:
- Tables.
- Constraints (Foreign Keys, Primary Keys, Unique).
- Table Types.
- Sequences.
- Functions.
- Stored Procedures.
- Synonyms.
- 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 в трех этапах:
- Проверяет, какие новый объекты были добавлены в схеме.
- Проверяет наличие изменений в каждом существующем объекте.
- Проверяет удаление объектов в схеме.
В первом случае: OCM генерирует скрипт, добавляет файл, определяет местонахождение в DB VS и обновляет дополнительные файлы.
Во втором случае: OCM сравнивает сгенерированный скрипт с существующим файлом в DB VS и, если объект изменился, меняет существующий файл.
В третьем случае: OCM удаляет файлы объектов, которые отсутствуют в текущей версии схемы.
Ниже представлены скриншоты, которые показывают, как выглядит окно плагина и как происходит процесс миграции:
Рис. 1. Список объектов (в данном случае таблицы), которые изменились
- красный цвет – удаленные айтемы,
- зеленый – новые,
- фиолетовые – измененные
Рис 2. Список Stored Procedure, которые изменились
Рис. 3. В Included окне входит список набранных объектов для изменения в DB VS
Рис. 4. Вопрос на принятие изменения в DB VS
Рис. 5. Идет процесс миграции в DB VS
Рис. 6. Сообщение об успешном выполнении миграции
TFS Manager Service (TFS MS)
TFS MS следит за каждым изменением, которое происходит в проекте, и отмечает их соответствующим образом: чтобы при Check-In все они попали в список измененных айтемов в TFC.
С помощью данного плагина мне удалось трекать все изменения в рамках нашего проекта. Я двигался дальше и расширил этот плагин для Merge Delivery Unit в разных схемах, а также для сравнения разных схем после процесса мерджа, чтобы убедиться, что все смерджилось правильно. Но об этом я расскажу в следующей статье
Автор: Peiman