要从 SQL 客户端编辑版本化数据,必须编辑数据的版本化视图,而不是基表(业务表)本身。版本化表使用两个关联表 - 添加表和删除表(统称为增量表)- 来记录更改。编辑表的版本化视图时,编辑内容将写入添加表和删除表。通过编辑基表可直接避开这一步骤,但可能会导致独立的记录和数据丢失。
针对版本化视图执行 SQL 数据操作语句时,对于每类语句会在数据库中执行以下操作:*
- 插入:向基础基表的添加表中添加行,并自动生成新行的对象 ID 值。
- 更新:更新实际上会删除原始行并添加包含新信息的新行。因此,当执行更新语句时,会同时向基础基表的添加表和删除表中添加行。
- 删除:向基础基表的增量表中添加行。
*如果在“默认”版本指向状态 0 时对该版本进行编辑,所有编辑内容都会立即移到基表中。
请注意,不会对通过 SQL 执行的编辑进行内部版本协调。因此,完成编辑后,必须通过 ArcGIS for Desktop 或 Python 脚本将您的编辑与父版本进行协调。
编辑选项
您可以创建新的指定地理数据库版本,然后编辑此版本,或者可以直接编辑“默认”版本。具体采取哪种操作取决于站点的要求。选择适当的模型很重要,即编辑命名的版本或编辑“默认”版本,从而确保最佳性能和可扩展性。
编辑命名版本
如果您的站点是以下任意一种情况,可以通过版本化视图创建并使用指定版本以使用 SQL 进行编辑:
- 多个编辑器必须更改相同的数据。
- 您需要明确定义的质量控制过程。
- 所作更改不必立即可用于其他用户;它们可以保持独立,直到将其协调并提交。
- 您想要编辑的版本化要素类使用二进制几何存储类型。
- 您想要编辑的版本化要素类或表注册为版本并且可以将编辑内容移至基表。
通过版本化视图编辑时,编辑内容将记录于添加表和删除表中。编辑内容会写入指定版本所引用的当前状态。
以下为在指定版本中编辑数据的步骤,应按如下顺序执行各步骤:
- 如果版本化视图尚不存在,则在版本化表或要素类中创建一个版本化视图。
- 创建用于执行编辑的地理数据库版本。
- 使用 set_current_version 过程可指定要对新版本进行访问。这样做会将编辑会话设置为指定版本所指向的状态并锁定此版本。
- 通过执行适合数据库的 edit_version 过程或函数启动编辑会话。
- 使用 SQL 对版本化视图执行编辑。
- 将编辑内容提交到数据库或回滚编辑内容。
- 通过执行适合数据库的 edit_version 过程或函数停止编辑会话。
- 通过 ArcGIS 协调并提交编辑。
- 使用 ArcGIS 将所有更改提交到父版本后,可删除在对版本化视图进行编辑时所创建的版本。
编辑“默认”版本
如果您的站点出现以下一种或多种情况,可以通过版本化视图使用 SQL 编辑“默认”版本。
- 要执行的编辑是短事务。
- 您的站点需要其他用户立即获得由版本化视图所作的编辑。
- 如果编辑要素类,要素类将使用 SQL 空间类型,而不是二进制几何存储。
- 要编辑的表或要素类未注册为版本并且可以将编辑内容移至基表。
编辑“默认”版本时,编辑内容会像编辑指定版本时那样记录于增量表中。然而,编辑“默认”版本时,查看“默认”版本的任何人都能看见编辑内容。
如果“默认”版本引用状态 0,每次编辑会直接应用于版本化表或要素类的基表。当使用 ArcGIS 客户端编辑“默认”版本时,将会在保存后更新版本以引用新的数据库状态。当使用版本化视图直接编辑“默认”时,每个插入、更新和删除操作都会写入“默认”版本引用的当前状态。
例如,如果使用 ArcGIS 客户端更新“默认”版本,同时通过版本化视图进行多项更改,可能会将通过版本化视图所作的更改应用到多个状态。
提交编辑内容后,可以立即访问以下内容:
- 使用版本化表和“默认”版本的用户或应用程序
- 使用子版本的用户或应用程序(此子版本具有包含“默认”版本当前状态的状态谱系)
如果要通过版本化视图编辑“默认”地理数据库版本中的数据,请不要设置版本或启动编辑会话。要执行的步骤如下:
- 如果版本化视图尚不存在,则在版本化表或要素类中创建一个版本化视图。
- 使用 SQL 对版本化视图执行编辑。您将自动编辑“默认”版本的当前状态。
- 将编辑内容提交到数据库或回滚编辑内容。最好在每次编辑后进行提交或回滚,因为打开事务时,增量表会保持独占锁定。直到事务结束后才会解锁。