SQL Server 中地理数据库内的版本化表

企业级地理数据库必须为多个用户同时创建和更新大量地理信息提供支持。因此,地理数据库必须提供可支持多个用户同时编辑但不创建多个数据副本的编辑环境。提供此功能时,该编辑环境还必须支持通常会持续数天的编辑会话、撤消和恢复对数据库所做更改的功能、数据模型的测试和开发以及不影响已发布数据库的替代应用程序设计方案,同时还可以监控数据和数据库随时间的变化情况。

为满足这些要求,可对 ArcSDE 地理数据库进行版本化。首先,将要素数据集、独立要素类和表注册为版本。然后,创建要在其中进行编辑的地理数据库的版本。这些版本是虚拟的;并不会创建地理数据库的副本。版本由与每个版本化数据集相关联的增量表和若干系统表表示,以追踪版本状态。

有关版本的信息,请参阅版本化快速浏览

ArcGIS Desktop 中的版本化表

在目录窗口中,版本化数据集与未版本化数据集的显示方式相同。通过打开要素类或表的属性 对话框,可以确定它们是否已版本化。在常规选项卡中,指示了要素类或表是否已注册为版本。

可以有多个地理数据库版本。在目录中,您可以对每个版本建立单独的空间数据库连接。与从其他版本预览相同要素类的情况相比,预览 DEFAULT 版本中的版本化数据集时,该数据集可能看起来有所不同,且包含的数据记录数不等。(有关如何与 DEFAULT 以外的版本建立空间数据库连接的信息,请参阅连接到特定地理数据库 (geodatabase) 版本。)

类似地,如果在 ArcMap 中通过两个不同版本查看同一版本化要素类,则效果可能有所不同。这是因为在一个版本中所查看的表或要素类包含一定的行数,而其他版本中的同一要素类可能包含不同的行数。

提示提示:

要查看地图中数据的版本,请单击 ArcMap 内容列表中的按源列出按钮。

以下示例显示的是 ArcMap 中地理数据库的 DEFAULT 版本里的 Fire hydrants 要素类:

Fire hydrants 要素类的默认版本

切换到另一个地理数据库版本(版本 wo2557)时,Fire hydrants 要素类会包含一个附加的消火栓和支线。这意味着,在使用 wo2557 作为源地理数据库版本进行编辑时,向 Fire hydrants 要素类添加了一个消火栓,并且向 Water laterals 要素类添加了一个支管。

数据的 wo2557 版本

这样会使人觉得每个版本都是一个单独的数据副本。但是,地理数据库会保留版本化表或要素类的原始形式,并将对该数据所做的全部更改存储在单独的地理数据库系统表中,而不是创建原始数据的新副本或修改原始数据。用于记录版本更改的地理数据库表被称为增量表。对于每个已版本化的表或要素类,会创建两个新增量表 - adds (a) 表和 deletes (d) 表。

Microsoft SQL Server 数据库中的版本化表

在内部,版本通过多个数据库表(数据集表、增量表和系统表)来管理,以追踪版本。

增量表

将要素数据集、独立要素类或表注册为版本时,会在数据库中创建增量表(添加和删除表)。增量表记录在每个数据库状态下对版本化表或要素类所做的全部插入、更新或删除操作。

注意注意:

只有数据集的所有者可以将数据集注册为版本。

a_<registration_id>

a<registration_id> 表(添加表)包含有关版本化业务表中各个插入或更新的记录(要素)的信息,并且可以查询该表来确定特定数据库状态时添加或修改的记录。添加表的名称中的 registration_id 是对应于版本化表的 SDE_table_registry 表的 Registration_ID 字段中的值。在上述消火栓示例中,SDE_table_registry 表中 Fire hydrants 要素类的 Registration_ID 是 161;因此,hydrants 要素类的添加表为 a161。

添加表包含所编辑版本化业务表的所有字段,另含 col_stateid

adds 表

字段名

字段类型

描述

是否允许空值

<版本化业务表中的所有字段>

<版本化业务表中字段的所有相应类型>

新要素的所有属性

SDE_STATE_ID

bigint

新要素添加或更新时所处状态的标识符

非空

例如,如果在版本化编辑会话期间向 Fire hydrants 要素类添加一个消火栓,则会在 A 表中为该新消火栓添加一条相应的记录。

d<registration_id>

d<registration_id> 表(或 D 表)包含与版本化表中已删除或已更新的所有行有关的信息,并且可通过查询识别特定状态下已删除或已修改的行。删除行时,不会以物理方式移除记录:它被标记为已删除并且不会再返回到后续数据库查询结果中。

deletes 表

字段名

字段类型

描述

是否允许空值

SDE_STATE_ID

bigint

新要素添加或更新时所处状态的标识符

非空

SDE_DELETES_ROW_ID

integer

删除要素或更新要素的唯一标识符

非空

DELETED_AT

bigint

要素被删除时所处的状态

非空

系统表

除了增量表,系统表也可以追踪版本化表和编辑内容。这些系统表为 SDE_states 表、SDE_state_lineages 表、SDE_versions 表和 SDE_mvtables_modified 表。

除 DEFAULT 版本以外,版本化数据库还包含许多其他版本。这些附加版本可能表示诸如工作指令、替代设计、离线编辑会话或历史快照等信息。SDE_versions 表包含这些版本的描述性列表,其中每个版本由唯一名称和 ID(ID 由 ArcSDE 自动生成)标识。此外,每个版本都具有所有者、描述、父版本、相关数据库状态和用户访问的级别。

当创建 SDE_versions 表时,会自动将 DEFAULT 版本的详细信息记录在此表中。ArcSDE 管理员拥有 DEFAULT 版本,并且相应的数据库状态的初始 ID 设置为 0。以下是 SDE_versions 表中 DEFAULT 条目的一个示例:

名称

所有者

Version_ID

状态

State_ID

描述

Parent_name

Parent_owner

Parent_version_ID

Creation_time

DEFAULT

SDE

1

1

0

实例默认版本

空值

空值

空值

2009-02-12 08:40:26

DEFAULT 记录

为管理对数据所做的编辑,版本化地理数据库维护数据库状态或数据库更改单元的集合。状态表示数据库更改时的离散快照:每个编辑操作都会创建一个新的数据库状态。(编辑操作是对要素和行执行的任意任务或任务集 [添加、删除或修改]。)所有地理数据库版本引用其中的一种数据库状态,并会随时间推移演化为一系列状态。

所有地理数据库状态都具有相同的方案,只是表示每个已修改表或要素类的行数有所不同。要识别冲突(当在相同或不同版本中编辑同一要素时可能会发生),会在版本协调期间比较版本状态谱系的差异或行冲突。

与状态相关的所有信息均在 SDE_states 表中进行管理。通过查询 SDE_versionsSDE_state_lineages 可识别每个版本引用的数据库状态。

状态包含在可从状态谱系中获得父子关系的树结构中。关于每个版本的状态谱系的信息则包含在单独的表 SDE_state_lineages 中。此表存储一个用于遍历状态父子关系的多条目索引,并且用于所有版本查询。

要返回某个版本的正确视图,通过查询其状态谱系可识别每次对该版本进行更改时所记录的所有状态。通过此状态列表,可确定正确表示版本的表行。由于地理数据库会被编辑并且版本随时间而更改,状态树变得更复杂。

每次在某个状态下修改要素类或表时,都会在 SDE_mvtables_modified 表中创建一个新条目。对两个版本进行协调时,此过程的第一个步骤是识别这两个版本引用的状态 - 当前编辑版本的状态和目标版本的状态。根据这些状态,通过追踪这两个版本的状态谱系可识别公共祖先状态。随后通过查询 SDE_mvtables_modified 表可识别在公共父状态与目标版本状态之间所修改的所有表。通过此修改表的列表,会生成这两个状态谱系通用的表的另一个列表。对于第二个列表中的所有公共表,会执行多个版本差异查询 - INSERT、UPDATE、DELETE、UPDATE_UPDATE 和 UPDATE_DELETE。

可在下图中看到版本化要素类中涉及的表:

SQL Server 中的版本化要素类

虚线表示各列之间的隐含关系。

添加和删除表的名称中的数字为 SDE_table_registry 表中业务表的 Registration_ID

XML 文档中的版本化表

XML 文档中的条目指示要素类或表是否已版本化。它由版本化标签括起。对于版本化要素类或表,该值为 true。

提示提示:

虽然版本化标签是在要素数据集上设置的,但不一定反映要素数据集内要素类的版本值。要确定要素数据集内的要素类是否已注册为版本,请单独查询各个要素类。

<Versioned>true</Versioned>

3/7/2012