基于Oracle触发器的ArcSDE数据库要素级监测
基于Oracle触发器的ArcSDE数据库要素级状态监测研究
蒋波涛1 钟文军2
(1,2 宁波市规划与地理信息中心宁波 315040)
摘 要:本文介绍了一种基于底层Oracle数据库的触发器对象对ArcSDE数据库单个要素状态变化监测的方法,弥补了ArcSDE数据库的GeoDatabase模型无法对地理要素在时间维度上进行管理的缺陷,将三维地理数据库转换为支持时间轴的四维空间数据库。该方法较目前普遍使用的各种技术手段具有快速、可靠和自动化程度更高等优点,同时减轻了数据服务器的访问压力并提高了监测效率。
关键词:ArcSDE数据库;Oracle触发器;要素级状态监测
中图分类号:P208
The Monitoring Study of ArcSDE Database’s Feature-level State Changes Based on Oracle Trigger
JiangBo-tao, ZhongWen-jun
(Ningbo Planning & Geography Information Center Ningbo 315040)
Abstract: This essay introduces a method of monitoring the ArcSDE database’s feature-level State changes, based on Oracle trigger. This method, which changes the three-dimensional geographical database into four-dimensional space database supporting the time axle, makes up the defect that ArcSDE database’ GeoDatabase model cannot manage the geographical facts from the time dimension. Compared with kinds of technologies used at present, this method has its advantages: on one side, it has high speed, reliability and automation, etc..; on another side, it abbreviates the visiting pressure on the database server and improving the monitoring efficiency.
Key Word: ArcSDE Database; Oracle Trigger; Feature-level States Monitoring
-
概述
空间数据库的存储和管理是一个复杂而长期的动态过程,其复杂度来源于技术和非技术两大因素。在技术层面上的复杂,是由于空间数据库的地物要素同时具有时间维和空间维的特征;在非技术层面上,由于地理数据分属不同区域等行政原因,使得大范围的地理数据的生产和管理具有多样性,人为增加了空间数据库的管理复杂性。
空间数据具有空间性和海量性等特点,管理海量空间数据最简单的方式是使用标准DBMS,如Oracle、SQL Server、DB2等进行存储。由于普通DBMS只能管理非空间属性数据,为实现存储和查询空间数据的功能,DBMS需要使用一种特殊的“空间数据通道(gateway)”,目前最常用的“空间数据通道”是ESRI公司的ArcSDE(Spatial Data Engine 空间数据引擎)产品。
ArcSDE是多用户ArcGIS系统的一个关键部件,它是一种中间件产品,其本身并不提供空间数据存储的功能,而是扮演了一种ArcGIS与标准关系数据库之间“数据通道”的角色,它为DBMS提供了一个开放的接口,在普通DBMS上实现了一个多用户GeoDatabase的逻辑模型,允许ArcGIS在多种数据库平台上管理地理信息。这些平台包括Oracle、Oracle with Spatial/Locator、Microsoft SQL Server、IBM DB2和Informix等。通过ArcSDE,ArcGIS和使用ESRI开发包编写的GIS程序可以简单地在普通关系数据库中存储和管理海量空间数据而无需考虑这些数据库之间的差别。
在一个空间数据库的地物要素管理中,数据管理员主要关心两点,一是空间数据属性的完整性和正确性,即在空间三维上地物要素的空间属性和非空间属性必须正确;二是空间数据在时间维度上的变化,即一个数据从采集入库成为现势数据到被更新为历史数据的过程。一个地物要素,必须同时获得它四个维度上的准确属性才有实用意义。
GeoDatabase模型关注的是数据的空间维特征管理,由于该模型本身的设计机制并没有考虑时间维度的情况,使得用户不能直接通过ArcSDE来监测地物要素的状态变化,即考虑到空间数据的时间维特征。
-
常用的时间维管理方式
ArcSDE数据库只能从三维的角度的来管理和存储空间数据,但数据用户常常需要某个时间段内某个区域的全部或部分空间数据,用于分析该区域的历史变迁情况。这种数据用例要求数据管理员必须记录空间数据库中地物要素的时间维状态,这种要求可以通过在空间数据库中添加辅助表和开发相应GIS程序的方式来实现。这类方法一般有三种:
-
使用时间戳管理方式
该方式在每一个地物要素的属性中添加一个入库时间的字段,此字段自动记录该要素存储到库中的时间。用户可以依据该字段取出某个时间段内空间数据库中更新的地物要素。
-
使用项目号管理方式
使用项目号作为要素的组织形式是在每一个要素的属性中添加一个项目号字段,这个字段将自动记录该地物要素所属的项目号,同时在库中有一个项目信息表,负责记录项目号、项目名称和入库时间。用户可以依据该项目信息表查询某个时间段内更新的项目,并通过该项目的项目号取出所有满足条件的地物要素。
-
使用更新范围面作为要素组织形式
该方式使用一个专门图层记录所有提交要素的更新范围面,每个要素都必须包含在一个范围面中,每个范围面均有一个入库时间的字段。用户可以通过查询范围面的入库时间,寻找出满足条件的要素。
以上的三种管理方式均需要在ArcSDE数据库中设计相应数据表,并开发配套的GIS程序才能实现。GIS程序需要通过ArcSDE读写地理数据库中的要素类或表,因此执行效率不高。本文通过分析ArcSDE实现的GeoDatabase模型的字典表,提出了一种高效的、基于DBMS层面的地理要素时间维管理方法。
-
SDE数据库的逻辑结构
ArcSDE在多用户DBMS上新建一个SDE 服务时产生了一个多用户GeoDatabase模型,为了实现该模型,ArcSDE会在DBMS中新建互相关联的61个字典表和多个触发器对象。
以Oracle作为数据库为例,ArcSDE在Oracle中建立的字典表分为两部分,一是以GDB开头的系统表,它们与数据存储有关;其它均为辅助表,用于记录显示信息、XML、License许可等信息。
在系统表中,有如下几个重要的字典表:
GDB_OBJECTCLASSES表,该表记录存储在SDE中所有的对象类(objectclass)信息,包括这些对象类在数据库中的唯一索引号。
GDB_FEATURECLASSES表,该表中记录的对象类均为要素类;GDB_FEATUREDATASET表,记录GeoDatabase中存在的要素数据集。
GEOMETRY_COLUMNS表是一个关联表,用于关联一个要素类的B表和F表。要素类是一个逻辑概念,它并不是一张表组成的,而是通过如下几个表共同维护,以要素类Test为例,它的组成表包括:
-
Business Table——即B表,业务表的表名与要素类名相同,为Test。它在逻辑上表现要素类,它存储了要素类所有的非空间信息和空间字段SHAPE,该字段并不存储实际的空间数据,而是一个指向该要素类F表的索引值。
-
Feature Table——即F表,它存储一个要素类的空间信息和元数据。这些表以F开头,如F110, 110则是要素类在SDE中的唯一索引号。要素类中的空间信息由F表的POINTS字段存储,它是Long Raw类型,用于保存二进制文件。
-
Spatial Index Table——即S表,它存储B表的Geoemtry的空间Grid Index。
-
Delta Table——如果一个要素类被注册为版本(version),则就会出现Delta表,这种表有两种类型,即a表——add table,用于记录被添加的要素类和d表,用于记录被删除的要素类。
图1是一个要素类的组成关系图:
图 1 要素类逻辑关系图
当用户通过ArcSDE在一个要素类中编辑要素的时候,B、F和S表(如果使用了版本机制,还有Delta表)会通过一种被称为Trigger(触发器)的过程性约束进行互动。如B表中删除一条要素后,F表和S表中的相应记录也会被触发器删除。
-
使用Oracle触发器对SDE库进行状态监测
Oracle触发器是一种编译好的、存储在数据库中的存储过程,它是特定事件出现的时候,自动执行的代码块,可以用于监测数据库或数据表记录的行为触发相应事件[1]。在数据库中,如果要实现一个表状态变化后引起另一个表的状态变化,可以使用触发器(Trigger)对象完成。
通过ArcSDE实现的版本空间数据库不会从物理上删除数据,它通过Delta表来监测不同版本情况下的要素变化。在版本GeoDatabase数据库中,对一个要素类的编辑有如下几种情况:
-
插入一条要素,该要素的信息将被记录在a表中;
-
删除一条要素,该要素的信息将被记录在d表中;
-
更新一条要素,更新要素是一个先删除后插入的过程,ArcSDE会先在d表中记录旧要素的信息,然后在a表中记录新要素的信息;
版本化的GeoDatabase数据库通过触发器对象实现这些过程,这是一种要素级层面上的监测。为了实现自定义的SDE空间数据库要素级别监测,数据管理员可以在Oracle中建立特殊的触发器对象实现地物要素状态的记录。
当一个要素类的B表发生变化,如插入一个要素,则在InsertFeatureRecord表中记录该要素的ObjectID值、该要素属于的要素类和入库时间;删除一条要素时,则在DeleteFeatureRecord表中记录该删除要素的相应信息。两个辅助信息表均以GeoDatabase中的表对象形式出现,这样可以直接被ArcGIS程序访问。下图是对一个要素类监测的过程图:
图 2 触发器在B表变化时进行的监测
下面是通过SQL*PLUS建立的一个触发器,代码如下:
‘建立一个名为dlg500respoly_manipulation的触发器
CREATE OR REPLACE TRIGGER dlg500respoly_manipulation
AFTER DELETE OR INSERT
ON gis.dlg500respoly ‘在表gis.dlg500respoly发生删除和插入后触发事件
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE ‘局部变量声明
tmplyrname VARCHAR2 (20) := 'DLG500RESPOLY';
tmpchangedate DATE := SYSDATE;
BEGIN
‘如果发生行删除事件,则往DeleteFeatureRecord表中插入记录
IF DELETING THEN
INSERT INTO DeleteFeatureRecord
VALUES (:OLD.objectid, tmplyrname, tmpchangedate);
END IF;
‘如果发生行插入事件,则往InsertFeatureRecord表中插入记录
IF INSERTING THEN
INSERT INTO InsertFeatureRecord
VALUES (:NEW.objectid, tmplyrname, tmpchangedate);
END IF;
EXCEPTION
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
RAISE;
END dlg500respoly_manipulation;
触发器dlg500respoly_manipulation编译成功后,它将保存在Oracle中。当要素类dlg500respoly发生数据要素插入或删除行为时,InsertFeatureRecord表或DeleteFeatureRecord表将记录该要素的OID、所属要素类和行为发生时间。
在给SDE库中所有的要素类B表都添加上相应的触发器后,当这些要素类发生插入要素或删除要素的行为时,两个辅助表中都将自动记录这些行为的相关信息。这个监测的优点在于:
-
监测发生在DBMS上,无需通过ArcSDE和使用GeoDatabase模型,监测效率较高,同样记录条数操作中耗费时间比使用ArcSDE少40%~55%;
-
被监测的数据无需注册为版本数据库;
-
监测是严格的过程性约束,可以严格监测到每一条要素的变化而不会发生异常丢失等问题,实现了要素级状态监测;
-
监测结果保存在GeoDatabase模型的表对象中,可以被ArcGIS直接访问,避免了读写底层数据库的操作。
-
结论
ArcSDE是目前最流行的空间数据管理软件,它抽象了空间数据对象模型,使用户可以利用标准DBMS存储和管理海量的空间数据。但ArcSDE数据库只关心空间数据的存储方式,并没有考虑在空间数据使用业务中往往需要知道的状态信息。尽管监测单个要素的行为可以通过编写代码实现,但其效率无法与在DBMS层上监测相比。
通过编写不同的DBMS级别的触发器对象,还可以监测SDE空间数据的用户登录、SDE服务运行等情况。通过结合DBMS的触发器对象与ArcSDE,数据管理员将能够构建一个效率更高、自动化程度更强的SDE空间数据库。
Related Items
Comments
Leave a comment
Or, take a look at Archives and Categories