在版本化数据集上启用存档将创建存档类,并用 DEFAULT 版本中存在的当前数据填充存档类。存档类使用 gdb_from_date 和 gdb_to_date 来保存存档更改的时间。启用非版本化数据存档以在类的基表内直接创建 gdb_from_date 和 gdb_to_date 字段。
表示时间
理解记录更改时 ArcGIS 如何表示时间十分重要。可用有效时间、事务时间或协调世界时间 (UTC) 记录历史。有效时间是在真实世界里发生更改的实际时刻,并通常由正在应用更改的用户记录下来。事务时间是在数据库中记录事件的时间。系统会自动生成事务时间。UTC 是通过 Internet 控制时钟和时间的主要标准。
当将更改保存到或提交到 DEFAULT 版本时,对于版本化数据存档,ArcGIS 使用事务时间(基于当前服务器时间)来记录对数据所做的更改。事务时间和在真实世界中发生该事件的时间很少是同一时间。在真实世界中发生的事件和在数据库中记录的事件之间会有时间差。例如,2006 年 5 月 14 日销售了一块宗地,然而直到 2006 年 6 月 5 日才记录此数据更改。针对这一更改,2006 年 6 月 5 日将作为事务时间被记录到存档类。
当发生编辑时,ArcGIS 会将事务存档到存档类。真实世界事件的时间和事务时间之间的区别可能看起来不是很明显,但当根据存档信息执行查询时就会变得十分明显。在生产系统中,编辑和更新数据方面的工作积压是很普遍的事,这将导致有效时间和事务时间之间的时间滞差。
如果许多不同用户或部门编辑数据库,在这种多用户环境中记录历史时,有效时间和事务时间之间的差异也是一个问题。在数据库中执行和记录更改的顺序可能与真实世界中发生这些更改的顺序不一致。
非版本化数据存档使用 UTC 代表时间。在编辑会话期间,保存编辑内容时会记录对数据的更改。
启用非版本化数据存档
启用存档时,gdb_from_date 属性和 gdb_to_date 属性会添加到基表。所有行的 gdb_from_date 属性都带有启用存档操作的日期和时间的时间戳。所有行的 gdb_to_date 属性都带有 12/31/9999 时间戳。无论何时只要一个属性具有 gdb_to_date 12/31/9999,它都是对象的当前表示。保存编辑内容时,地理数据库会对更改进行自动存档,如下所示:
- 新建要素的 gdb_from_date 属性值设置为存档操作时间戳,gdb_to_date 属性值设置为 12/31/9999。
- 在编辑会话中更新的要素通过将 gdb_to_date 属性值设置为存档操作的时间戳来更新基表中的关联行,并插入带有 gdb_from_date 属性值和 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 时间戳。无论何时只要一个属性具有 gdb_to_date 12/31/9999,它都是 DEFAULT 版本中对象的当前表示。当将编辑内容保存或提交到 DEFAULT 版本时,地理数据库会自动将更改存档到存档类。如下所示:
- 在 DEFAULT 版本中创建的要素在存档类中被表示为带 gdb_from_date 属性值和 gdb_to_date 属性值的行,其中 gdb_from_date 属性值被设置为存档操作的时间戳,gdb_to_date 属性值被设置为 12/31/9999。
- 在 DEFAULT 版本中更新的要素通过将 gdb_to_date 属性值设置为存档操作的时间戳来更新存档类中的关联行,并插入带 gdb_from_date 属性值和 gdb_to_date 属性值的新行,其中 gdb_from_date 属性值被设置为存档操作的时间戳,gdb_to_date 属性值被设置为 12/31/9999。
- 在 DEFAULT 版本中删除的要素通过将 gdb_to_date 属性值设置为等于存档操作的时间戳来更新存档类中的关联行。
更新存档表在单个数据库事务中执行。如果在事务过程中遇到了错误,则回滚整个存档操作,因而也不会完成保存或提交操作。一旦改正了错误,就可以再次执行保存或提交操作。
对于每个存档操作,DEFAULT 历史标记使用存档操作的值进行更新。当使用历史版本并选择 DEFAULT 历史标记时,这确保存档类的当前表示等同于事务 DEFAULT 版本中的版本化类的表示。
访问存档类实际上可以比使用等同的版本化类占用较少的数据库资源。
如果应用程序开发者对捕捉存档操作时间的事件感兴趣,可参阅“软件开发者工具包”中的 Iversionevents2 接口上的 OnarchiveUpdated 事件。
对历史版本的查询在存档类上执行:
对事务版本的查询仍然在基表和增量表上执行:
添加要素
在宗地结构中的要素显示宗地号 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,因为这时它还尚未创建。更新时刻 (7/14/2005 3:45:23 AM) 之后的任何查询将显示带扩展边界的宗地 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 版本中没有该对象。