Интеллектуальное копирование таблиц
Операция Интеллектуальное копирование таблиц данных используется для слияния данных из одной таблицы данных (источника) с данными в другой таблице данных (цели). Оно называется "интеллектуальным" не просто так. Допустим, у вас имеется свойство "Клиенты разрешены" в каком-то контексте (например, вымышленный контекст "AccessControl"). Для данного конкретного контекста переменная относится к бинарному типу - может быть либо Да (разрешить клиенты), либо Нет (не разрешать).
А теперь представим, что у вас есть другой контекст, например, (вымышленный) контекст "OfficePrinter", у которого также есть свойство с названием ClientsAllowed. Только в этот раз это целое число, представляющее количество клиентов, которые могут подключаться к этому принтеру или опрашивать его. Это не бинарное значение. Но оно имеет такое же название! (Что часто случается в разнотипной, открытой системе)
Итак, если серверная операция копирования по умолчанию взяла свойства и просто скопировала их поверх базового имени, вскоре возникнет проблема. Нужно было воспользоваться "умным" копированием значений свойств, не нарушая систему, и поэтому мы разработали Интеллектуальное Копирование Таблиц Данных.
Вообще говоря, операция Копирование Таблиц Данных копирует как можно большее количество данных из исходной таблицы в целевую, но всегда контролирует, чтобы целевая таблица сохраняла свой оригинальный формат.
Например, если определение формата целевой таблицы указывает, что максимальное количество записей 5, в таблице будет 5 записей после операции копирования, даже если в исходной таблице было 100 записей.
Другой пример: если исходная и целевая таблицы содержат поле под названием "значение", но в исходной таблице тип значения Строка, а в целевой таблице тип значения Целое, операция копирования не изменит тип поля в целевой таблице. Вместо этого операция попытается конвертировать все строки из исходной таблицы в целые и записать их в целевую таблицу.
Операция копирования не отменяется, если появляются ошибки при копировании некой записи или поля. Вместо этого операция продолжается, стараясь скопировать как можно больше данных. Отчет об ошибках приходит после завершения операции.
Процесс копирования выбирает один из следующих способов:
Ключевое поле - это поле или набор полей в таблице, которые вместе составляют уникальный идентификатор для записи (элемента таблицы). Совокупность этих полей обычно просто называется "ключом". |
Первый способ выбирается, если формат целевой Таблицы Данных определяет ненулевое количество ключевых полей. Если ключевого поля нет, используется второй способ.
При любом способе система контролирует, что количество записей в целевой таблице не превышает минимальные и максимальные значения (определенные форматом определение переменной).
Копировать с ключевыми полями
Если в целевой таблице есть Ключевые Поля, которые не определены как Ключевые Поля в исходной таблице, операция переходит в режим копировать без ключевых полей.
Операция копирования делится на три этапа. На каждом этапе происходит работа с записями, имеющими одинаковые значения во всех Ключевых Полях в обеих таблицах (совокупное значение всех ключевых полей называется "ключом").
1. Все записи в целевой таблице, содержащие ключи, которых нет в исходной таблице, удаляются.
2. Данные из каждой записи исходной таблицы копируются в запись целевой таблицы с тем же ключом, если он есть.
3. Для каждой оставшейся записи исходной таблицы создается новая запись в целевой таблице, и данные из исходной записи копируются в новую запись.
Последовательность записей в целевой таблице не меняется в процессе копирования с ключевыми полями. Все записи с ключами, которых нет в целевой таблице, будут добавляться в конец целевой таблицы, независимо от их положения в таблице-источнике. |
Копировать без ключевых полей
Этот способ копирования также происходит в три этапа.
1. Если количество записей в целевой таблице больше, чем в исходной таблице, последние записи в целевой таблице удаляются, чтобы сравнять количество записей.
2. Каждая запись исходной таблицы копируется в запись целевой таблицы с тем же номером.
3. Если количество записей в исходной таблице больше, чем в целевой таблице, в целевой таблице создаются новые записи, чтобы сравнять количество записей. Данные из исходной записи копируются в новую запись с тем же номером.
Алгоритм копирования записи данных
При копировании исходной записи (одна строка в таблице) в запись назначения, каждое поле в строке тестируется, чтобы понять, может ли оно быть скопировано:
1. Если поле заявлено как "только для чтения" в формате целевой записи, оно пропускается.
2. Если поле заявлено как нереплицируемое в формате источника целевой записи, оно пропускается.
3. Если поле имеет тот же тип в исходных и целевых записях, его значение копируется напрямую.
4. Если у поля различные типы в исходных и целевых записях, SberMobile Server старается конвертировать значение. Например, все типы значений могут конвертироваться в значение Строка, значения Строка могут иногда конвертироваться в Целое, и т.д.