我正在使用ArcGIS 9.3.1,并尝试使用已注册为版本控制的SDE地理数据库(具有一个面要素类)。我是版本控制的新手,但仍在尝试弄清其中的一些基本功能。到目前为止,我还无法发现将某些修改发布到父版本后是否可以“取消”或“拒绝”某些修改。

例如,假设我们有三个版本:在注册为版本时创建的原始SDE.DEFAULT,默认名称为SDE.QA(用于质量保证)的子版本,以及QA的子版本,称为SDE.Edit1(首先进行编辑)。如果编辑了SDE.Edit1的某些功能(例如,为了简单起见,假设添加了一个多边形,然后删除了一个多边形),然后将SDE.Edit1与SDE.QA协调一致,然后发布到SDE.QA,有什么办法以后可以撤消此更改?跟进这个问题,是否可以仅拒绝某些更改?例如,接受添加第一个多边形,但拒绝删除第二个多边形?

据我所知,一旦将修改发布到父版本中,所有这些更改现在已成为父版本的“永久”(缺少更好的词)部分。我知道以下事实:所有这些更改都记录在两个表中,即“ ADD”和“ DELETE”表(通常称为“ delta”表),实际上并没有更改原始FC本身。我考虑研究手动更改这些增量表,但是我发现有足够的人警告说这可能不是正确的解决方案。

也许是我对版本控制的理解需要一些工作,但是一旦发布更改,我似乎无法找到拒绝更改或撤消更改的方法。我觉得这很奇怪,因为这意味着无法撤消包含错误的帖子。我似乎也找不到找到这些版本沿袭的方法(即哪个版本是哪个父级的子级)。当我在讨论这个话题时,如果有人知道任何特别有用的ArcSDE参考资料(链接,文章,书籍等),这些参考资料可能有助于我对ArcSDE的理解(并可能回答其中的一些问题),将不胜感激。 !


尽管到目前为止的回答是有帮助的(感谢您的链接),但我仍然无法找到问题核心的答案。再一次,也许这是我自己对情况的误解。这是我想知道的内容:

将帖子从子版本转换为父版本后,您可以将其撤消吗?在这种情况下,父级可以是SDE.DEFAULT版本,但不一定是。更好的是,我想知道发布后是否可以撤消发布的一部分(例如,对多边形进行一次编辑)?我还想知道是否可以在不需要检测到任何冲突的情况下完成此操作。

我无法为该问题找到明确的答案(即“是”或“记录在任何地方的“否”使我认为我缺少有关ArcSDE版本控制的重要信息。我也希望避免手动操作A和D表。

#1 楼

啊。答案确实是一个复杂的问题,需要很多ArcSDE背景知识,所以我将尝试尽可能简短。
请注意,我将参考超棒的版本控制白皮书中的一些图表,您可以从中找到在ESRI网站上。如果您要处理版本控制,我强烈建议您通读它。
然后,您需要了解状态(即状态树中的节点)和命名版本(即标签)之间的关系。指向一个状态)。
一个典型的数据库可能看起来像下面的状态图:

这里,您在数据库中有四个版本(版本A,版本B,版本C和版本)。默认)。但是也许,我有点领先了。让我们从状态是什么开始。
您可以将状态视为“事务”-一种逻辑单元,其中包含对一个或多个表的多个编辑。它可能包含两个插入到“ FeatureClass A”的功能,从“ Feature Class B”中删除的功能以及对“ Feature Class X”的修改(有效地是删除+插入)。全部归为一个。
让我们看一个小而简单的ArcSDE状态图,该状态图从状态ID 0开始:

如果从状态0开始并且进行了一个或多个编辑在编辑操作中使用表格,您将创建一个子状态1并将其设为当前活动状态ID。随后的另一组编辑将创建子状态2。如果要撤消操作,则无需以任何方式修改状态ID-您要做的就是将当前活动状态ID更改为1或0(取决于您想走多远)。重做是相反的-只需将当前活动状态ID向前移动-一直向前移动即可。
这就是撤消/重做在ArcSDE版本控制中的工作方式。
好,继续。假设您要永久保存修改(即要保存)。你该怎么办好吧,保存只是获取版本标签并将其移至特定状态。有点像盖章然后说“这是版本A的外观”。因此,如果回顾一下第一个图,您将看到它具有四个命名版本。


版本B指向状态ID 1


版本A指向状态ID 3


版本C指向状态ID 5


版本“ SDE.DEFAULT”指向状态ID 4
请注意,尽管人们普遍认为,此图并未告诉您有关他们之间逻辑上的亲子关系的任何信息。第一张图的逻辑父子关系可能看起来像这样:



这是您在ArcMap / ArcCatalog中看到的父子关系。目的是限制可以协调的版本。此时,您可能(正确地)问自己,为什么我需要这个?答案在于版本控制工作流。事实证明,人们使用版本控制已经有一段时间了,并且有一些结构化方式的首选方式,但这是第二天的话题,因为我今天想回答您的问题:)
。 。
好,那么这个命名版本还有什么作用?好吧,它们会影响这个称为compress的过程的行为。
Compress的全部目的在于获取可能不需要的中间状态,并删除不必要的状态并将其组合在一起。您可以通过ArcCatalog触发ArcSDE压缩操作,设置可以一次执行一次的服务,并且某些ArcMap编辑操作将触发微型压缩操作(即,仅针对正在使用的小分支)。
该图左侧显示的是压缩前的状态树,右侧的是压缩后的状态树:

要理解的一个重要概念(一旦我最终回答您的问题,我会参考您的意思)是,每个状态都是潜在的候选压缩对象-带有标签(即命名版本)的状态除外。 />您可以看到,在压缩之前,存在一些多余的不必要状态。实际上,整个[3,4,5]分支都已删除。如果在5处有一个命名版本,最终结果将有很大的不同。
压缩操作可以通过删除不再需要的记录来节省数据库空间。
继续。
您需要了解的最后一个概念是协调-有效地将两个分支合并为一个。
因此,让我们回到我们的第一个图表。假设您要针对SDE.DEFAULT协调版本A。
回顾一下:四个命名版本指向各种状态ID。因此,我们要做的第一件事是在目标版本下创建一个子状态,因此我们在状态ID 4下创建一个子状态,在我们的示例中,我将其称为状态ID20。

下一步是计算两个版本之间的差异(此信息的详细信息太长了,但是我可以告诉您,它们是使用差异游标完成的),然后将这些差异应用于新的状态ID 20(蓝线) 。

假设您决定进行更多编辑,或者发现冲突,并从一个版本或另一个版本中选择行。没关系这些只是新的编辑,并且在编辑操作内完成,因为子状态在您合并的分支下。在此示例中,在协调之后,我又进行了两个连续的编辑。

可爱。
所以现在说您准备好“发布”该版本。这意味着什么?那只是抓住标签并将它们指向相同的状态ID。在这里,我将发布版本A到SDE.DEFAULT。外观如下:

TADAAA!因此,现在版本A和SDE.DEFAULT指向相同的状态ID,因此它们看起来相同。
好,现在我终于可以回答您的问题了。
您可以撤消帖子吗? ArcGIS文档将告诉您“否”-请勿打扰。不要这样做,因为您会弄乱这种逻辑,并且如果您不知道自己在做什么,则可能会破坏数据。
但实际上,要做的只是更新一次ArcSDE版本控制表之一-VERSIONS表,并修改标签的条目(又名命名版本)。在我们的示例中,指向状态ID 21,您刚刚撤消了整个编辑操作。将其设置为3,您只需要取消整个协调即可。将其设置为5,现在您处在完全不同的位置。是否存在冲突是无关紧要的。
当然,这是假定没有发生压缩。让我们考虑一下在刚好同时更新SDE表的同时进行压缩的情况。请记住,如果您(或其他人)在发布后执行压缩,则树的外观如下:

您可以在压缩后撤消协调吗?好吧,在这种情况下,不会。压缩已炸毁了整个分支,因此您无法撤消-数据已被删除。如果该分支上还有另一个命名版本,则该压缩将不会破坏该分支。我希望到现在为止这是有道理的。
那么你应该这样做吗?由您自己决定,如果您不知道自己在做什么,可以在压缩后轻松释放数据。

评论


很好的答案拉吉! SDE版本控制是一个复杂的过程。

–blah238
2011年10月5日在7:17

谢谢。我在ArcObjects中维护/扩展了协调代码三年,因此我在各种ArcGIS版本中都进行了调整。为了简化概念,我省略了一些内容。我希望答案足够清楚。

–拉吉·亚瑟(Ragi Yaser Burhum)
2011年10月5日在7:49

谢谢您的彻底回答,拉吉!我觉得自己现在对自己的事业有了更好的了解。您将指向不同状态ID作为“撤消”更改的机制(或者也许“退一步”)的解释更为合理。我仍在探索您提供的ArcSDE版本表链接。无论如何,我都会听取您的建议并谨慎行事。再次感谢您抽出宝贵的时间逐步进行操作!

–Sole23
2011年10月5日,12:33

+1对此书签。我认为这说明了为什么大多数人不应该修改SDE版本表,当我得知正在考虑它的人时,我将发送该答案的链接!

–杰伊·康明斯(Jay Cummins)
2012年7月24日上午9:50

哇,您对我的一个问题发表了评论,过去的几个小时我一直在阅读您所回答的所有问题。很棒的东西,谢谢。

–ianbroad
13年8月8日在2:03

#2 楼

有一个名为Geodatabase Toolset(GDBT)的工具,它是ArcCatalog的插件。它可视化状态行和版本:

在此处下载GDBT

评论


谢谢你Stefan这正是我希望存在的那种东西!这使可视化和跟踪我的SDE FC的血统变得更加容易。

–Sole23
2011年9月30日15:19

同样,大多数人也不知道这一点,但是(只要状态没有被完全压缩掉),您可以向VERSIONS表中添加任何仍然有效的状态ID的条目,然后使用arcgis来愉快地浏览,编辑,甚至可以使用标准ArcGIS工具协调该版本。版本只是状态ID的标签,这些状态ID迫使ArcSDE使这些状态保持活动状态。

–拉吉·亚瑟(Ragi Yaser Burhum)
2011年10月3日在16:44



好,让我做一个更详尽的回答。

–拉吉·亚瑟(Ragi Yaser Burhum)
2011年10月5日,下午6:54

链接断开。

– PolyGeo♦
20-10-31在23:48

#3 楼

缺少版本和数据库。这是一些对您有帮助的初始信息。基本管理员
这是有关rec和post的一些信息。
因此,如果您应用这些概念并使用版本更改命令,您仍然有机会在以下情况下拒绝这些更改:您记录并发布到默认值。

您没有同一个数据库的三个副本。
您只有一个版本的副本。
如果您要管理此数据库,则应该花时间(甚至金钱),并熟悉所有这些内容。版本的sde编辑工作流程。
该课程很棒!了解多用户地理数据库的版本化编辑工作流。

评论


这些链接适用于sql server-但附近还有其他rdbms帮助文件。

–布拉德·尼索姆(Brad Nesom)
2011年9月30日在16:41

我观看了您推荐的Esri研讨会的免费录像:多用户地理数据库的版本化编辑工作流。我认为这确实很有帮助,并且值得一看(约1个小时)。再次感谢您的推荐。我还找到了一个链接,以查看他们对在这里的研讨会期间没有时间回答的其他问题的答案。

–Sole23
2011年10月4日18:20



#4 楼

我有一种“快速又肮脏”的方法。
将ove切换到默认版本,然后编辑有关已删除多边形的内容。然后,当您调和为默认值时,就会发生冲突。右键单击该冲突,并告诉它使用预协调状态。对我有用。

#5 楼

是的,您可以执行此操作,但是必须使用SQL进行操作。

我不容忍此事,请自担风险。总是在手动编辑SDE之前备份您的数据。然后,您可以转到A和D表,并删除与state_id相匹配的条目。

    SELECT *
    FROM SDE.VERSIONS
    WHERE NAME = 'Version of interest';


现在您拥有了感兴趣的state_id。现在,您需要查找要素类的A和D表。您可以通过查询table_registry来实现。该值将是registration_id。因此,要获取A和D表,只需将registration_id添加到A和D中。

    REGISTRATION_ID = 1
    A table would be A1
    D table would be D1


然后只查询A和D表并删除具有以下内容的条目可以通过上面的查询获得state_id。

要了解有关父子关系的更多信息,只需从以下sde表中进行查询。 >这些都有关系,应该可以帮助您跟随弹跳球。

#6 楼

一旦将编辑从子版本发布到父版本,就无法撤消它们。请参阅:http://help.arcgis.com/zh-CN/arcgisdesktop/10.0/help/index.html#//00270000001s000000.htm


无法撤消发布操作,因为您正在将更改应用到您当前未编辑的版本。


您可以查看对帐过程中对每个版本所做的编辑-这是您拒绝某些编辑的机会。此处说明了对帐过程。

#7 楼

是的,就像其他人所说的那样,简短的答案是否定的。

SDE版本控制非常有前景,但不幸的是,它的工作流程仅假定功能的向前更改。

全功能SDE中的版本控制将提供以下工具-


允许(功能级)回滚和接受/拒绝
将允许撤消
,并允许撤消先前状态(即从状态3开始,撤消状态1的更改,但保留状态2的更改。)

这就像是SVN源代码控制版本控制系统,但具有空间功能。

评论


嗨,大卫,是的,这就是我研究版本控制时所想到的。不幸的是,当前的工作流程并没有提供那么多的灵活性,但是我认为这是一个正在进行中的工作,也许最终会成功。

–Sole23
2012年5月23日12:53

好吧,如果数据从不压缩,那么从理论上讲,您可以根据需要任意返回。问题在于数据库联接的速度变慢,系统缓慢降级为无法使用。问题与源代码管理管理不同,后者的巨大git源仓库(如linux内核)目前约为175MB。在地理环境中,这将是一个更大得多的问题。尽管如此,真正聪明的人现在正在考虑这个问题。参见Geogit:blog.opengeo.org/tag/geogit

–拉吉·亚瑟(Ragi Yaser Burhum)
2012年10月3日,0:44

#8 楼

简单回答是不。

发布版本的目的是将这些编辑提交到目标版本。

回滚是通过不发布版本来完成的(删除所有此类版本是一种很好的做法

在编辑版本时,编辑应用程序(例如ArcMap)可能会提供各种级别的“撤消”,并且用户可以选择保存/不保存此类编辑到正在编辑的版本中。

但是在发布到目标(例如sde.default)之后,唯一的撤消方法是通过hack到sde系统表。