|
|
|||||||||||||||||||||||||||||
|
Автоматизация миграции базы данных DocsVisionИсточник: habrahabr Namelles_One
ПреамбулаКазалось бы - если система закрытая, то должны быть удобные инструменты? Ну, или хотя бы API для возможности написания этих удобных инструментов самостоятельно. К сожалению, обычно все плохо: инструменты есть, но настолько неудобные, что от их наличия - никакого счастья. Приходится выкручиваться. Итак, дано - система DocsVision (далее DV) версии 4.5 SR1. И, стоит задача переместить базу с одного сервера на другой (скажем, клиенты купили новый). Проблема, которая при этом возникает - ровно одна. Права на объекты для локальных учетных записей при переносе базы на новое место превратятся в тыкву. А так как стандартные группы DV являются именно локальными - то проблем не избежать. Кто заинтересован - прошу пожаловать под кат.
Стандартные инструментыДля начала рассмотрим тот инструмент, что нам предлагает для этих целей компания DocsVision. Казалось бы - это то, что нам нужно, но - только на первый взгляд.
Как видно из скриншота - только по одной записи за раз, что даже в случае пары десятков локальных учеток - ну очень неудобно. А, исходя из реального опыта - клиенты без домена встречаются не реже, чем клиенты с доменом. И в этом случае - все пользователи заведены на сервере локально. И руками обрабатывать сотню-другую учеток - ничуть не улыбается. Поэтому и было принято решение - написать нечто свое.
Исследование структуры БДDocsVision - платформа закрытая и документирована только в рамках предоставленных разработчикам API. Но, кое-какая информация все-таки по интернету гуляет, и ее оказалось достаточно. Основными интересующими нас таблицами являются dvsys_instances и dvsys_security. Первая содержит информацию обо всех объектах системы (карточки, папки, справочники, файлы и т.д.), вторая же. не мудрствуя лукаво, хранит описатели безопасности. Структура таблиц приведена ниже.
Связь таблиц осуществляется по полям dvsys_instances.SDID и dvsys_security.ID. Также, необходимо отметить, что количество записей в этих таблицах различается очень сильно, спасибо наследованию прав. Например, у одного из клиентов эти значения составляют 277571 и 6639 соответственно. Итак, задача поставлена - необходимо пройтись по всем строкам второй таблицы, раскодировать описатели безопасности, заменить старые SID для необходимых записей на новые и, предварительно закодировав, записать обратно. Что ж, приступим.
Реализация задуманногоВ качестве языка разработки был выбран PowerShell, так как большую часть необходимых задач с его помощью можно решить легко и непринужденно. Для удобства использования все настройки были вынесены в отдельный файл. К таковым можно отнести таблицу соответствия аккаунтов и настройки доступа к БД.
Мне показалось логичнее запускать скрипт на целевом сервере, поэтому старые учетные записи присутствуют в виде SID-ов (для их получение также можно использовать PowerShell, об этом знает Гугл). А новые - укажем в виде учеток и их SID-ы получим в процессе работы скрипта. Также, как выяснилось в процессе разработки, PowerShell не умеет создавать экземпляры объектов generic-ков, поэтому из недр Гугла для этого пришлось достать функцию New-GenericObject. Ее код приводить не буду, в конце статьи будет ссылка на репозитарий - все там. Для удобства, при работе скрипта, в консоль выводится лог, поэтому было решено создать структуру для более удобного накапливания информации.
Для наиболее полного логирования запрос, конечно же, возвращает гораздо больше информации, чем мог бы, но - красота требует жертв.
Поэтому, чтобы не обрабатывать один и тот же описатель много раз - идентификаторы записываются.
А далее начинается самое интересное:
Таким образом, получен универсальный механизм для любой миграции - между серверами заказчика, между сервером разработки и заказчиком, да мало ли еще как. В конце, как и было обещано: ссылка на репозитарий с описанным кодом. Ссылки по теме
|
|