在 Oracle 中使用多版本化视图和 SQL 编辑版本化数据
可通过编辑基于数据创建的多版本化视图来编辑地理数据库中的版本化数据。
有若干个随 ArcSDE 安装的存储过程,用于帮助处理多版本化视图。这些组件及其描述如下:
存储过程 |
用途 |
语法和描述 |
---|---|---|
sde.version_user_ddl.create_version |
创建新的地理数据库版本。 请始终编辑您自己的单独版本;使用多版本化视图时,多个编辑器无法编辑同一个版本。 |
EXEC sde.version_user_ddl.create_version ('<parent_version>', :<child_version_variable>, <name_rule>, <access>, '<description>') <parent_version> 是版本创建时所基于的版本。 <child_version> 是正在创建的版本的名称。 <access> 是版本的访问权限等级;0 表示“私有”,1 表示“公有”,2 表示“受保护的”。 <description> 是子版本的文本描述。 |
sde.version_util.set_current_version |
设置将访问的地理数据库版本。 |
EXEC sde.version_util.set_current_version('<version_name>') <version_name> 是要连接到的地理数据库版本的名称。 |
sde.version_user_ddl.edit_version |
启动和结束编辑会话。 |
EXEC sde.version_user_ddl.edit_version('<version_name>',<1 or 2>) 指定 1 启动编辑会话。指定 2 结束编辑会话。 |
sde.version_user_ddl.delete_version |
删除地理数据库版本。 |
EXEC sde.version_user_ddl.delete_version('<version_name>') |
通过多版本化视图编辑版本化表时,增量表也会随之变化,并且会自动生成新记录的行 ID(对象 ID)值。不过,与在 ArcGIS 编辑会话中编辑版本化数据不同,不会对这些编辑进行内部版本协调。
此外,在多版本化视图中启动编辑会话时,将在版本所引用的状态中放置排它锁。因此,强烈建议不要将多版本化视图用于编辑 DEFAULT 版本或者任何可能由其他用户的同步编辑或协调的版本,因为多版本化视图不会检测冲突,同时,放置的排它锁还会阻止其他用户的编辑。应该专门为多版本化视图编辑会话创建自有版本。
- 必须使用 ArcGIS 软件来执行版本管理操作,例如协调、解决冲突和提交。不适当的版本管理在处理视图时可导致地理数据库损坏。
- 切勿使用数据库管理系统 (DBMS) 工具来更新数据库中由 ArcSDE 维护的任何行 ID(对象 ID)字段。这些对象 ID 字段由地理数据库进行分配和管理,因此不应使用 SQL 进行更改。
- 切勿使用 SQL 编辑地理数据库的 DEFAULT 版本。对一个版本启动编辑会话会对此版本所引用的状态设置排它锁。如果锁定 DEFAULT 版本,将阻止 ArcGIS 用户连接到地理数据库。
下列步骤指导您创建多版本化视图、创建用于执行编辑的版本、设置要编辑的版本、启动编辑会话、利用多版本化视图执行某些编辑、停止编辑会话、提交编辑到数据库以及删除针对编辑创建的版本。在这些示例中,为对表执行编辑而创建的多版本化视图是 code_mv,为编辑而创建和使用的版本是 mvedits。
请记住,通过多版本化视图编辑的数据集必须已注册为版本。
-
在 MS-DOS (Windows) 或 shell(UNIX 或 Linux)命令提示符处,执行 sdetable 工具以创建多版本化视图。
sdetable –o create_mv_view –T code_mv –t code_enf –i sde:oracle11g –u sarja –p not4U@orasvc
-
打开 SQL 客户端,然后声明一个变量来存储将在下一个步骤中创建的版本。
VARIABLE mv_version NVARCHAR2(10); EXEC :mv_version := 'mvedits';
在此例中,mv_version 为变量名,NVARCHAR2(10) 为变量的数据类型,mvedits 为版本名称。
-
创建用于执行编辑的新版本。
EXEC sde.version_user_ddl.create_version ('sde.DEFAULT', :mv_version, sde.version_util.C_take_name_as_given, sde.version_util.C_version_private, 'multiversioned view edit version');
-
将编辑会话的版本设置为刚刚创建的子版本。
EXEC sde.version_util.set_current_version('mvedits');
-
通过执行 version_user_ddl.edit_version 存储过程并指定 1 来启动编辑会话。1 表示应启动编辑会话。
EXEC sde.version_user_ddl.edit_version('mvedits',1);
-
使用 SQL 对多版本化视图执行第一次编辑。
在此例中,对现有记录进行了更新。
UPDATE code_mv SET propowner = 'C. Industry' WHERE vid = 2233
-
使用 SQL 对多版本化视图执行下一次编辑。
在此例中,一条新记录被插入表中。
INSERT INTO code_mv (codenum,propowner,shape) VALUES (567, 'Anjo Badsu', sde.ST_PointFromText('point (40 40)', 12));
提示:在 INSERT 语句中未指定对象 ID 值;多版本视图会自动获取下一个可用对象 ID,然后为行插入该 ID。
对于仅注册到 ArcSDE 并且拥有用户维护的对象 ID 列的表,尽管可以对其进行版本化,但并不推荐进行这种操作。但是,如果坚持这样操作,则必须为 INSERT 语句提供对象 ID;多版本化视图无法生成值。
- 执行 COMMIT 或 ROLLBACK 语句。
-
通过执行 version_user_ddl.edit_version 存储过程并指定 2 来停止编辑会话。
2 表示应关闭编辑会话。
EXEC sde.version_user_ddl.edit_version('mvedits',2);
-
完成所有编辑操作后,通过 ArcGIS Desktop 协调和提交编辑,然后删除在步骤 3 中创建的地理数据库版本。如果决定放弃所做的更改,则不必协调和提交编辑,直接删除在步骤 3 中创建的版本即可。
EXEC sde.version_user_ddl.delete_version('mv_version');