суббота, 16 сентября 2017 г.

Синхронизация словаря данных


В работе с АХ крайне важным является выполнение синхронизации словаря данных [Data dictionary]. Если не понимать, что это за процесс и для чего он нужен, то в какой-то момент можно столкнуться с проблемами, связанными с синхронизацией.

Запускается синхронизация словаря данных из AOT:


Попробуем разобраться что же такое "синхронизация словаря данных".
Рассмотрим как АХ работает с SQL-сервером. Определения таблиц (имя таблицы, имена столбцов, их тип, длина и т.п.) хранятся в AX. Однако, так или иначе эти данные должны содержаться на SQL-сервере, иначе невозможно будет хранить данные в БД. 

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

На самом деле все довольно просто. Вы просто запускаете синхронизацию таблицы, которую создали, и АХ обработает расхождения. После запуска процедуры синхронизации SQL получит все необходимые данные по физической таблице и сервер сможет работать с данными.

SQL Словарь

Теперь рассмотрим идентификаторы объектов (ID) и SQL-словарь таблиц на SQL-сервере. Каждый объект в АХ получает идентификатор. В АХ идентификатор присваивается объекту в момент его создания (также в момент импорта *.xpo или нового объекта в AOT, или импорта модели).

Разберем как АХ работает с таблицами на SQL сервере. Система берет параметры таблицы в AOTе и переносит их (поля, их названия, длину, тип и т.п.) на SQL. Как же АХ отслеживает, что хранится на SQL сервере? Будет ли достаточно проверки имен объектов? 
Таблица на SQL может быть проверена по имени в AOT. Итак, представим, что изменилось имя поля таблицы с columnA на columnB. Таблица, которая изменилась, не содержит никаких пометок, что ее поля были изменены.

Что же произойдет на SQL сервере, когда будет выполняется синхронизация словаря данных по таблице? Останется старое поле columnA и создастся новое поле columnB? Удалятся ли значения в исходном поле?
Для этого используются «системные» таблицы AX, в которых хранится информация о том, что АХ записала на SQL сервер. Таблица SQLDictionary содержит имена объектов АХ, их имена на SQL сервере и их ID в AX.

ID объектов АХ не могут быть изменены разработчиком вручную в IDE (Integrated Development Environment - интегрированной среде разработки), таким образом, это значение может использоваться для идентификации объекта в случае изменения его имени. Итак, теперь можно дать ответ на вопрос, указанный выше: если изменится имя столбца, то АХ будет искать в SQLDictionary запись, соответствующую столбцу и, если найдет, то обновит ее (заменив старое имя на новое), а если не найдет, то создаст новую запись с новым именем.
Happy DAXing!