Разрешение архивирования для версионного набора данных произведет создание архивного класса и заполнит его текущими данными версии DEFAULT. Архивный класс использует поля gdb_from_date и gdb_to_date для поддержки значений времени, когда изменение было заархивировано. При включении архивирования неверсионных данных, создаются поля gdb_from_date и gdb_to_date непосредственно в базовой таблице класса.
Представление времени
Важно понимать то, каким образом ArcGIS производит представление времени, когда изменение было записано. История может быть записана с текущим временем, временем транзакции или с Всемирным координированным временем (UTC). Текущее время отражает момент времени, когда в реальном мире произошло изменение, и обычно записывается пользователем, который внес это изменение. Рабочее время отражает время, когда событие было записано в базу данных. Рабочее время генерируется системой автоматически. UTC – это основной стандарт, используемый для настройки часов и времени через Интернет.
Для архивации версионных данных ArcGIS использует время транзакции, которое основано на текущем серверном времени, для записи изменений данных, когда изменения сохраняются и закрепляются в версии DEFAULT. Рабочее время и время, когда событие произошло в реальном мире, очень редко совпадают. Между событием реального мира и записью этого события в базу данных всегда имеется определенный промежуток времени. Например, участок продан 14 мая 2006 г.; но изменения в данные не были занесены до 5 июня 2006 г. Время транзакции (5 июня 2006 г.) занесено в архив как измененные данные.
При произведении изменения ArcGIS произведет архивирование транзакции в архивный класс. Различие между временем появления события в реальном мире и рабочим временем может показаться неважным, но оно станет более заметным, когда вы начнете выполнять запросы к архивированной информации. Задержки в редактировании и обновлении данных в рабочих системах является нормой, и это приводит к появлению временных расхождений и появлению промежутка между действительным и рабочим временем.
Различие между действительным и рабочим временем также приводит к появлению сложностей в тех ситуациях, когда в многопользовательской среде, где базу данных редактируют много разных пользователей или подразделений, происходит запись истории. Последовательность, с которой изменения производятся и заносятся в журнал базы данных, может быть отличной от последовательности, с которой изменения происходят в реальном мире.
При архивировании неверсионных данных используется время UTC. Изменения в данных записываются тогда, когда исправления сохраняются в сеансе редактирования.
Включение архивирования для неверсионных данных
После включения архивирования в базовую таблицу добавляются атрибуты gdb_from_date и gdb_to_date. Атрибут gdb_from_date для всех строк будет иметь временную отметку с датой и временем, когда операция архивирования была разрешена. Атрибут gdb_to_date для всех строк будет иметь временную отметку 12/31/9999. Всякий раз, когда атрибут будет иметь значение 12/31/9999 для gdb_to_date, он будет текущим представлением объекта. При сохранении изменений база геоданных автоматически архивирует изменения следующим образом:
- Вновь создаваемые объекты будут иметь атрибут gdb_from_date, для которого установлены значения временной отметки операции архивации, и атрибут gdb_to_date, для которого установлено 12/31/9999.
- При обновлении объектов в сеансе редактирования произойдет обновление связанных строк базовой таблицы путем установки атрибута gdb_to_date в значение временной отметки операции архивирования; вставки новой строки с атрибутом gdb_from_date со значением временной отметки операции архивирования; установки атрибута gdb_to_date в значение 12/31/9999.
- При удалении объектов в сеансе редактирования происходит обновление связанных строк в базовой таблице путем установки атрибута gdb_to_date в значение, равное временной отметки операции архивирования.
Включение архивирования для версионных данных
Как только архивирование будет разрешено, все строки, представленные в версии DEFAULT для определенного класса, будут скопированы в архивный класс с той же самой временной отметкой. Атрибут gdb_from_date для всех строк будет иметь временную отметку с датой и временем, когда операция архивирования была разрешена. Атрибут gdb_to_date для всех строк будет иметь временную отметку 12/31/9999. Всякий раз, когда атрибут будет иметь значение 12/31/9999 для gdb_to_date, он будет текущим представлением объекта в версии DEFAULT. Когда изменения будут сохранены и закреплены в версии DEFAULT, база геоданных произведет автоматическую архивацию изменений в архивный класс. Это означает следующее:
- Объекты, созданные в версии DEFAULT, будут представлены в архивном классе в виде строк с атрибутом gdb_from_date, для которого установлены значения временной отметки операции архивации, и атрибутом gdb_to_date, установленным в 12/31/9999.
- При обновлении объектов в версии DEFAULT произойдет обновление связанных строк в архивном классе путем установки атрибута gdb_to_date в значение временной отметки операции архивирования; вставки новой строки с атрибутом gdb_from_date со значением временной отметки операции архивирования; установки атрибута gdb_to_date в значение 12/31/9999.
- Удаление объектов в версии DEFAULT произведет обновление связанных строк в архивном классе путем установки атрибута gdb_to_date в значение, равное временной отметки операции архивирования.
Обновление архивной таблицы производится в рамках одной транзакции базы данных. Если в ходе транзакции возникнут какие-то ошибки, то будет произведен откат всей операции архивирования и, следовательно, операция сохранения или закрепления завершена не будет. Как только ошибка будет исправлена, вы сможете выполнить операцию сохранения или закрепления.
При выполнении каждой операции архивирования маркер истории версии DEFAULT обновляется вводом значения операции архивирования. Это может обеспечить то, что при выборе маркера истории версии DEFAULT при работе с исторической версией, текущее представление архивного класса будет приравниваться к представлению версионных классов в рабочей версии DEFAULT.
Доступ к архивному классу может действительно потреблять меньше ресурсов базы данных, чем работа с тем же версионным классом.
Разработчикам приложений, которые заинтересованы в использовании программного компонента события, производящего регистрацию момента операции архивирования, следует обратиться к событию OnarchiveUpdated интерфейса Iversionevents2 из комплекта разработчика.
Запросы к историческим версиям выполняются к архивным классам:
Запросы для рабочих версий все еще выполняются для основных таблиц и дельта-таблиц:
Добавление пространственного объекта
Этот объект в наборе данных участков показан за номером 116 в соответствующей строке. В версионных данных эта строка появится в архивном классе. В неверсионных данных эта строка появится в базовой таблице участков. Атрибут gdb_from_date показывает время и дату создания, а атрибут gdb_to_date показывает 12/31/9999, поскольку объект не был изменен или удален с момента разрешения архивирования.
При вставке объекта (земельного участка 117) в архивном классе происходит вставка строки со значением gdb_from_date, обновленным временной отметкой этой операции закрепления. Атрибут gdb_to_date в этой новой строке показывает 12/31/9999, потому что этот объект еще должен быть обновлен или удален.
Обновление пространственного объекта
При обновлении объекта для атрибута gdb_to_date устанавливается значение временной отметки операции архивирования и для того, чтобы показать текущее представление этого объекта, производится вставка строки. Для значения gdb_from_date в этой новой строке устанавливается время выполнения операции архивирования, а для значения gdb_to_date отображается 12/31/9999, поскольку объект еще должен быть изменен или удален.
На следующем рисунке отображается два земельных участка, 116 и 117, с соответствующими им атрибутами gdb_from_date и gdb_to_date до выполнения операции обновления.
Если граница участка 117 удлинится, значение gdb_to_date будет обновлено значением временной отметки операции архивирования, а также добавится новая строка. Атрибут gdb_from_date в этой новой строке будет иметь значения времени и даты выполнения операции архивирования.
Например, при выполнении запросов, которые будут использовать моменты времени до обновления (7/12/2005 5:34:22 PM), земельный участок 117 будет показан в том виде, каким он был до обновления. Запросы к моментам времени до 7/9/2005 2:23:43 PM не покажут земельный участок 117, поскольку к этому времени он еще не был создан. Любые запросы к моменту времени после обновления (14/07/2005 в 03:45:23) будут отображать земельный участок 117 в его текущем виде с расширенной границей.
Удаление пространственного объекта
При удалении объекта атрибут gdb_to_date будет обновлен значением временной отметки операции архивирования. На следующем рисунке отображены земельные участки, 116 и 117, с соответствующими им атрибутами gdb_from_date и gdb_to_date.
Если участок 117 теперь удалить, атрибут gdb_to_date будет обновлен значением временной отметки операции архивирования.
Техническое замечание об архивировании версионных данных
При возникновении описанной ниже ситуации в архивном классе может возникнуть расхождение во времени:
Редактор напрямую редактирует версию DEFAULT и удаляет объект в сессии редактирования.
Затем редактор сохраняет изменения, которые производят обновления атрибута gdb_to_date архивного класса с временной отметкой удаления данного объекта.
Если этот же объект будет обновлен в дочерней версии и затем согласован с версией DEFAULT, то возникнет конфликт.
Если в процессе разрешения конфликта редактор выберет заменить конфликт обновленным представлением строки, то эта строка будет восстановлена в версии DEFAULT при закреплении этой версии. Операция архивирования произведет вставку новой строки в архивный класс и установит для атрибута gdb_from_date значение временной отметки, а для gdb_to_date значение 12/31/9999.
Следовательно, когда редактор посмотрит на то, как с течением времени изменялось дерево состояний этого объекта, то в датах будет иметься разрыв между атрибутами gdb_to_date и gdb_from_date, когда объект еще не существовал в версии DEFAULT.