写本文的最初意向是当前正在进行的项目中有实现ESRI版本化数据管理的功能模块,碰到一些棘手的问题,几经周折还是决定系统学习ArcGIS10的帮助文档。(文章摘抄的比较多)
地理数据库是用于保存数据集集合的“容器”。首先了解一下ArcGIS的三种地理数据库类型:
地理数据库在可扩展性、跨平台以及性能方面ESRI都推荐使用文件地理数据库而非个人地理数据库。而ArcSDE地理数据库针对的是大型的多用户的企业解决方案,其可用来管理共享式多用户地理数据库和支持多种基于版本的关键性GIS工作流。
这里重点来理清ArcSDE对DBMS事务框架进行长事务管理和短事务管理:
ArcSDE 的主要角色之一就是支持每个 DBMS 中的地理数据库版本管理框架。
绝大多数情况下,GIS 中的单个编辑事务可能涉及对多个表中的多个行进行更改。例如,更新宗地可能需要更改面的表示,并更改相应的边界线和宗地拐角。此外,还必须更新这些要素中每个要素的属性记录。此编辑操作需要对多个表中的多条记录进行更改。在这些情况下,用户希望将此编辑集合视为单个事务。提交或回滚这些更改时,会将它们视为一个统一的操作来进行管理。
同时,用户希望能够在一个编辑会话中撤消和重做单个编辑操作。为了使这种情况变得更为复杂,可能需要在与中央共享数据库断开连接的系统中执行编辑操作。
而且,在这些专门化的 GIS 数据维护过程中,GIS 数据库必须持续保持对日常操作可用,而在这些日常操作中,每位用户都有可能获取共享 GIS 数据库的个人视图或状态。
通过使用一种称为版本管理的方法,ArcSDE 地理数据库支持在多用户环境下对这些数据管理情景及许多其他数据管理情景进行管理和更新。在版本管理这种机制下,所有的数据库更改都作为表中的行进行记录。例如,每次更新某一行中的某个值时,旧值即会失效,并会新增一个更新行。
这样,通过将更改信息以增量记录的方式存储在数据库中,ArcSDE 技术就能在简单 DBMS 事务框架中管理复杂的高级 GIS 事务。
ArcSDE 使用版本的元数据来隔离多个编辑会话、支持复杂事务、共享复本、同步多个数据库之间的内容、执行自动存档并支持历史查询。
再来看看ESRI提供的数据库维护策略:
非版本化数据维护
版本化数据维护
ArcGIS 可以用下列两种方法之一管理支持版本的基础增量表:
下面具体看看如何使用版本化数据:
通过以上基本知识的了解,深入探索一下版本和版本化编辑的工作原理:
对任意版本中的数据开始执行版本化编辑之前,必须将数据集注册为版本。
理解将数据集注册为版本和创建版本的区别:
无论在哪个版本中进行编辑,对要素类或表所做的全部编辑都会被记录到同一增量表。总的来说,基表、A 表和 D 表中的所有行表示要素类或表的所有版本。这表示任何一个版本都只能引用这三个表中的行的子集。那么,ArcGIS 如何记住增量表中属于各版本的行呢?
以上概念性的描述不太形象,来看看Oracle数据库中是通过哪些表来追踪版本:
在内部,版本通过多个数据库表(数据集表、增量表和系统表)来管理,以追踪版本。
添加和删除表的名称中的数字为 TABLE_REGISTRY 表中业务表的 REGISTRATION_ID。
在创建版本时,会在Versions表中创建一条新纪录,包括版本名称、版本描述、版本创建时间等信息,最需要注意的是Status和State_ID两个字段;
Status:默认值为1,表明该版本正在进行版本事务状态;
State_ID:获得最新的编辑状态ID;
所有进行的编辑都会在STATES表(状态表)中记录相关的编辑状。在版本编辑时,该表会记录每一步的编辑状态,但是在保存编辑时,会记录一个最终的有效的编辑状态。举例说明:创建一个要素(记录了一次状态),填写属性(记录第二次的状态),但是当保存编辑的时候,只记录最终的一个编辑状态。
STATE_LINEAGES表(世系表)与STATES表(状态表)是类似的,只存储最终的编辑状态。所谓世系表,是说如果一个DEFALUT版本创建一个子版本,相应的编辑状态值会对应继承DEFALUT版本的LINAEAGE_NAME值进行记录,如果在另外一个子版本进行编辑,会获得最新的编辑状态作为另一个子版本的LINEAGE_NAME值来记录该版本的编辑状态。
在MVTABLES_MODIFIED表中记录了针对每一个注册ID(也就是要素类)的多版本编辑状态。
所有在注册版本记录上新创建的数据都会存储在A表中,因为A表也有一个编辑状态,所以根据STATES表的编辑状态可以定位到A表的某条数据,所有的空间数据、属性数据的信息都可以获得。
所有注册版本记录上的对数据的删除信息都保存在D表中,记录相关的删除状态、OBJECTID、新建的状态ID,根据后两个字段可以唯一定位到删除数据信息。
只介绍STATES和STATE_LINEAGES这两个表的变化,在协调版本时会将子版本的数据与相应父版本进行协调,上面我们介绍各个版本对应一个LINEAGE_NAME,所以这两个表会添加两条相应的记录。特别介绍一下STATES表,添加一条记录是一个新的协调状态ID(STATE_ID),然后记录开始时间和结束时间,对应的世系版本ID会是当前编辑版本的值,而且还会添加一条记录,就是对应协调目标版本的协调ID,协调版本的LINEAGE_NAME,以及创建时间,但是结束时间没有进行存储。
这里也就对应了上面所说的在协调过程中只会更新编辑版本的数据,并不会更新协调版本的数据。
也只介绍STATES和STATE_LINEAGES这两个表的变化,上面所说的对应协调版本的结束时间没有存储,在进行提交版本后,就存储了协调版本的结束时间(对应STATES表的记录)。
在提交过程中,Versions表还会进行相应的变化,因为针对于某一个子版本的事务已经结束,那么STATUS值和STATE_ID也会发生相应的变化。
STATUS:变为某一个很大的值,表明该版本结束了相关事务;
STATE_ID:获得结束该版本编辑的一个状态值,也可以理解为获得当前一个最新的编辑状态ID。
随着对地理数据库不时进行编辑,增量表的大小和状态的数量会有所增加。表越大、状态越多,每次显示或查询版本时 ArcGIS 所必须处理的数据就越多。要保持数据库的性能,ArcSDE 管理员必须定期运行“压缩”命令,以移除不使用的数据,之后再使用“分析”命令更新数据库统计数据。
压缩操作很有必要,因为随着对编辑地理数据库不断进行编辑,增量表的大小和状态的数量也会不断增加。表越大、状态越多,每次显示或查询版本时 ArcGIS 所必须处理的数据就越多。因此,对性能的最大影响不是版本的数量,而是增量表中对每个版本的更改量。因此,各个版本就可能具有不同的查询响应时间。
要维护数据库性能,ArcSDE 管理员必须定期运行压缩操作来移除未使用的数据。
理解“将编辑内容移动到基表”类型的注册版本:
在将不参与网络、拓扑或历史归档的数据注册为版本时,您可以指定是否要将对 DEFAULT 版本进行的编辑移动到基表中。如果指定此选项,则仍将更改记录到增量表中。但是在进行保存时,会将更改从增量表中移动到基表,而增量表中不会保存更改。
在将数据注册为版本时,如果所做的修改仅需要数分钟即可完成并且使用第三方应用程序连接到版本化地理数据库,则指定此选项会很有帮助。
第三方应用程序通常仅可用于查询基表,而无法查看增量表。如果使用版本化,且未选择将编辑移动到基表,那么这些应用程序将无法查看尚未协调并提交到 DEFAULT 版本的在其他版本中进行的编辑。请注意,编辑 DEFAULT 之外的版本时,会在同一增量表中记录更改。保存时,更改会保留在增量表中。但是,将更改合并到 DEFAULT 版本时,更改会从增量表移动到基表。将更改合并到 DEFAULT 之外的版本时,更改将保留在增量表中,就像未指定将编辑移动到基表的选项一样。
Oracle中针对版本管理策略的添加和管理用户:
那么什么是用户权限?
权限用于决定授权用户对数据和地理数据库执行何种操作。应根据人员在组织中所执行的工作类型来分配权限。用户是否为地理数据库的管理员?用户是否需要编辑或创建数据?用户是否仅需查询数据?
对用户或用户组指定的权限会影响他们在地理数据库中所能执行的操作。有些用户只能连接到地理数据库。这些用户为只读用户。另有一些用户可连接到地理数据库并创建数据集。另有一些用户可连接到数据库并编辑数据集,但无法创建或删除数据集。还有一些用户可执行管理任务,如创建备份文件或执行压缩操作。
可在不同级别设置用户权限:数据库、地理数据库版本以及数据库中的数据集。
这些权限用于决定用户或用户组可在地理数据库中或对地理数据库执行的操作;例如,用户是可以创建新数据集还是可以管理地理数据库。
还可以通过设置权限来控制用户对地理数据库版本的访问。这是一种特殊的数据库权限类型,并不通过 DBMS 进行设置。而是在创建地理数据库版本时由该版本的创建者决定其他用户对此版本所具有的访问类型。如果将版本创建为“公共”版本,则所有用户均可对其进行访问及修改。如果将其创建为“私有”版本,则只有该版本的创建者可以对其进行访问。如果版本为“受保护”版本,则其他用户可以查看该版本,但只有创建者可以对其进行修改。
数据集权限用于决定用户可对特定数据集执行的操作:用户是可以对数据集进行编辑,还是只能从中查询数据?特定数据集的使用权限由该数据的所有者(即为创建数据或将数据导入地理数据库的用户)进行控制。可授予用户只读(查询)权限,也可授予读/写(更新、插入和删除)权限。这些数据集权限用于决定用户是否为编辑者;如果用户不具备任何数据集的更新、插入或删除权限,则此用户不是编辑者。
下列规则适用于授予和撤消数据的权限:
对版本机制原理和Oracle中ArcSDE管理用户策略有了个大概的了解以后,来看看ArcGIS有关地理数据库权限,这些是如何来控制对数据的访问:
在创建版本时,创建者可以指定版本的名称、可选版本描述和版本的权限,作为版本的所有者,您可以随时更改这些属性或删除版本。
您可以设置版本权限以防止版本被版本所有者以外的用户编辑或查看。可对版本设置下面其中一种权限:
设置版本权限时,要考虑版本的工作流策略以及在该框架下工作的各类用户的需要。应同时使用版本权限和数据集权限来控制对数据的访问。
设置权限时,应特别注意 DEFAULT 版本所采用的保护方式。DEFAULT 版本是地理数据库中所有其他版本的祖先版本,通常代表已发布的地理数据库版本。对于从 DEFAULT 版本中删除的任何要素或行,即使这些要素或行已记录在版本的增量文件中,也无法恢复,除非将数据集取消注册版本(假设事先未压缩数据库)。将数据集取消注册版本可以将数据集恢复为上次压缩数据库时的配置;不过,所有未压缩的编辑内容都将丢失。鉴于这一点,完全有必要保护 DEFAULT 版本以防止发生意外修改或损坏。
可通过三种方法来保护 DEFAULT 版本:
对于版本机制的实现原理,版本表的变化是非常复杂的。尤文G斯博客的博主强烈建议:由于机制实现相关表的关系比较复杂,禁止用户直接利用操作普通表的方法修改SDE库中版本表的相关数据,因为一旦把相关的状态联系删除错误,那么就意味着你可能要重新建库。
本人亲身体验过由于在SDE中直接操作历史归档相关表导致的SDE库混乱的痛苦,所以建议大家遵循ESRI公司的规则,没有对机制更深入的理解还是不要直接去操作相关表。