使用ArcSDE进行版本控制时,可以取消或拒绝发布的编辑吗?


28

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

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

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

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


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

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

我在任何地方都找不到对这个问题的明确答案(即“是”或“否”)的事实,这使我觉得我缺少有关ArcSDE版本控制的重要信息。我也希望避免手动操作A和D表。


?版本和rdbms会有所帮助
Brad Nesom 2011年

Answers:


53

啊。答案确实是一个复杂的问题,需要很多ArcSDE背景知识,因此我将尝试尽可能简短。

请注意,我将参考ESRI网站上的超棒版本白皮书中的一些图表。如果您正在处理版本控制,我极力建议您通读它。

然后,您需要了解状态(即状态树中的节点)和命名版本(即指向状态的标签)之间的关系。

典型的数据库可能看起来像下面的状态图:

典型的arcsde数据库图

在这里,数据库中有四个版本(版本A,版本B,版本C和默认)。但是也许,我有点领先了。让我们从状态开始。

您可以将状态视为“事务”-一种逻辑单元,其中包含对一个或多个表的多次编辑。它可以包括两个插入件为“要素类A”,一个删除从“功能B类”和修改(有效地删除+的插入件),以“要素类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的过程的行为方式。

压缩就是获取不必要的中间状态,并删除不必要的状态并将其组合在一起。您可以通过ArcCatalog触发ArcSDE压缩操作,设置一个可以一次执行的服务,并且某些ArcMap编辑操作将触发微型压缩操作(即,仅针对正在使用的小分支)。

左图显示了压缩前的状态树,右图显示了压缩后的状态树:

压缩图

要理解的一个重要概念(一旦我终于回答你的问题,我会指代你)是每个状态都是潜在的候选压缩对象-带有标签(即命名版本)的状态除外

您可以看到,在压缩之前,存在一些多余的不必要状态。实际上,整个[3,4,5]分支都已删除。如果在5处有一个命名版本,最终结果将有很大的不同。

通过删除不再需要的记录,可以进行压缩操作以节省数据库空间。

好,继续。

您需要了解的最后一个概念是协调 -有效地将两个分支合并为一个。

现在让我们回到第一个图表。假设您要针对SDE.DEFAULT协调版本A。

让我们来回顾一下:指向各种状态ID的四个命名版本。因此,我们要做的第一件事是在目标版本下创建一个子状态,因此我们在状态ID 4下创建一个子状态,在我们的示例中,我将该状态ID称为20。

开始调和

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

和解推送

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

调和后编辑

可爱。

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

发布

TADAAA!因此,现在版本A和SDE.DEFAULT指向相同的状态ID,因此它们看起来相同。

好的,现在我终于可以回答您的问题。

您可以撤消帖子吗?ArcGIS的文档会告诉你没有 -不要惹它。请勿这样做,因为您会弄混这种逻辑,如果您不知道自己在做什么,则可能会破坏数据。

但是实际上,要做的就是对其中一个ArcSDE版本控制表 VERSIONS表进行一次更新,并修改标签的条目(也称为命名版本)。在我们的示例中,指向状态ID 21,您刚刚撤消了整个编辑操作。将其设置为3,您只需取消整个协调即可。将其设置为5,现在您处在完全不同的位置。有没有冲突是无关紧要的。

当然,这假定未发生压缩。让我们考虑一下在刚好同时更新SDE表的同时进行压缩的情况。请记住,如果您-或其他人-在发布后执行了压缩,这就是树的样子:

发布后压缩

压缩后可以撤消对帐吗?好吧,在这种情况下,不会。压缩已炸毁了整个分支,因此您无法撤消-数据已被删除。如果该分支上还有另一个命名版本,则该压缩将不会破坏该分支。我希望到现在为止这是有道理的。

那你应该这样做吗?由您自己决定,如果您不知道自己在做什么,可以在压缩后轻松释放数据。


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

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

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

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

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

7

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

在此处下载GDBT


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

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

好,让我做一个更详尽的回答。
Ragi Yaser Burhum 2011年

3

缺少版本和数据库。这是一些可以帮助您的初步信息。
基本管理员
这是有关recpost的一些信息,
因此,如果您应用这些概念并使用version changes命令,当您将rec和post设置为默认值时,仍然有机会拒绝这些更改。

您没有同一数据库的三个副本。
您有一个带有版本的副本。
如果您要管理此数据库,则应该花时间(甚至是花钱)并熟悉所有这些内容。用于多用户地理数据库
的esri类“ 版本化编辑工作流”是免费的,将对您有所帮助。
但是完整的蒙特将是我对管理任何版本的sde编辑工作流的人员的建议。
那个班很棒!了解 多用户地理数据库的版本化编辑工作流


感谢您的回应,布拉德。我将研究您推荐的链接和类!
Sole23 2011年

这些链接适用于sql server-但还有其他rdbms帮助文件,这些文件非常接近这些链接。
布莱德·内索姆

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

3

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


1

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

我不容忍此事,请自行承担风险。始终在手动编辑SDE之前始终备份您的数据。

您可以查询sde.versions表以从发布的版本中获取要撤消的更改的state_id。然后,您可以转到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表中查询即可。

    state_lineages
    versions
    states

这些都有关系,应该可以帮助您跟随弹跳球。



1

是的,正如其他人所说,简短的答案是“否”。

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

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

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

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


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

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

0

简单回答是不。

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.