写本文的最初意向是当前正在进行的项目中有实现ESRI版本化数据管理的功能模块,碰到一些棘手的问题,几经周折仍是决定系统学习ArcGIS10的帮助文档。(文章摘抄的比较多)数据库
地理数据库是用于保存数据集集合的“容器”。首先了解一下ArcGIS的三种地理数据库类型:网络
地理数据库在可扩展性、跨平台以及性能方面ESRI都推荐使用文件地理数据库而非我的地理数据库。而ArcSDE地理数据库针对的是大型的多用户的企业解决方案,其可用来管理共享式多用户地理数据库和支持多种基于版本的关键性GIS工做流。并发
这里重点来理清ArcSDE对DBMS事务框架进行长事务管理和短事务管理:框架
ArcSDE 的主要角色之一就是支持每一个 DBMS 中的地理数据库版本管理框架。性能
绝大多数状况下,GIS 中的单个编辑事务可能涉及对多个表中的多个行进行更改。例如,更新宗地可能须要更改面的表示,并更改相应的边界线和宗地拐角。此外,还必须更新这些要素中每一个要素的属性记录。此编辑操做须要对多个表中的多条记录进行更改。在这些状况下,用户但愿将此编辑集合视为单个事务。提交或回滚这些更改时,会将它们视为一个统一的操做来进行管理。学习
同时,用户但愿可以在一个编辑会话中撤消和重作单个编辑操做。为了使这种状况变得更为复杂,可能须要在与中央共享数据库断开链接的系统中执行编辑操做。操作系统
并且,在这些专门化的 GIS 数据维护过程当中,GIS 数据库必须持续保持对平常操做可用,而在这些平常操做中,每位用户都有可能获取共享 GIS 数据库的我的视图或状态。.net
经过使用一种称为版本管理的方法,ArcSDE 地理数据库支持在多用户环境下对这些数据管理情景及许多其余数据管理情景进行管理和更新。在版本管理这种机制下,全部的数据库更改都做为表中的行进行记录。例如,每次更新某一行中的某个值时,旧值即会失效,并会新增一个更新行。设计
这样,经过将更改信息以增量记录的方式存储在数据库中,ArcSDE 技术就能在简单 DBMS 事务框架中管理复杂的高级 GIS 事务。3d
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公司的规则,没有对机制更深刻的理解仍是不要直接去操做相关表。