天天看點

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

 因為對空間資料管理的不善(非法的删除、重命名等),導緻sde中存在一些垃圾資料、和圖層名稱被占用,這種問題已經有好幾個同僚問我怎麼解決了?現把這個問題已經解決了,下面将整個詳細過程寫出來,共享給碰到同樣問題的網友。

測試環境:

Oracle 10.2.0.2

Arcsde 9.3 for oracle 10gR2

Oracle使用者名:test

先用arccatalog在test使用者下面建立二個圖層,圖層名稱為:testdljx_d,testdltb_mian

問題一:清除arcsde中的空間垃圾資料

問題緣由:

用oracle管理控制台直接删除空間資料所在的使用者(也叫方案),但是在Arcsde還是能看到對應的圖層名稱,這些圖層無法浏覽,形成了垃圾資訊,并且這些垃圾圖層資訊無法删除,提示表沒有找到,怎麼去掉這些垃圾圖層資訊?

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

原理說明:

其實Arcsde隻是空間資料引擎,隻是作為空間資料存取的一個管道而已,不真正存放空間資料,真正的空間資料是存放在底層的關系型資料庫中的。如我用arc catalog建立了2個圖層,那麼用在對應的oracle使用者下面中找到對應的二個表。

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

因為關系型資料庫最底層的邏輯實體是二維表,是以一旦直接用底層oracle的管理工具(如:PLSQL、OEM)删除了存放到oracle裡面的二維表,那麼上層的arcsde就無法存取了。

雖然Arcsde隻是一個空間資料存取的管道,但是我們通路空間資料都是通過arcsde的服務來通路的,當然arcsde不是什麼都不做,arcsde主要通過自身的系統表來控制對空間資料的通路,就像oracle的system使用者一樣,系統表存放在oracle的sde使用者下面,用sde使用者登入到oracle,可以看到對應的表資訊。

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

系統表裡面記錄了每個空間資料的圖層名稱、空間資料的擁有者,我用arccatalog建立2個圖層(tdljx_d,testdltb_mian)時,會在sde系統表中找到對應的資訊,如下所示:

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

到了這裡肯定大家就知道後面怎麼解決了。無非不就是删除sde系統表下面的垃圾記錄,不就可以解決了,對的。問題是這些垃圾記錄存放在sde那些系統表下面呢?

解決過程:

1,用plsql登入到oracle中,删除剛剛建立的二個圖層testdljx_d,testdltb_mian,重制問題現象,然後用arctalog浏覽這二個圖層,發現無法浏覽。

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

2,找出arcsde資料庫邏輯關系圖,如果安裝了arc info,則位置一般為:C:/Program Files/ArcGIS/Documentation/93_sde_diagram.pdf 找到datasets部分就可以清楚知道要删除哪些表的記錄了。如果不怕麻煩的話,可以把sde使用者下面的系統表一個一個打開,有列中含有“testdljx_d,testdltb_mian”的記錄就删除。最後找到了如下表:

TABLE_REGISTRY、column_registry、LAYERS、ALL_ST_GEOMETRY_COLUMNS_V、

GDB_OBJECTCLASSES、GEOMETRY_COLUMNS、gdb_usermetadata、ST_GEOMETRY_COLUMN、ST_GEOMETRY_INDEX、gdb_featuredataset

3,寫一個删除的sql或者存儲過程都行,如下所示:

delete   from sde.GDB_OBJECTCLASSES where  owner =upper('test') ;

delete  from sde.GEOMETRY_COLUMNS where  F_table_schema =upper('test') ;

delete   from sde.GEOMETRY_COLUMNS where  G_table_schema =upper('test') ;

delete   from sde.gdb_usermetadata where  owner =upper('test') ;

delete   from sde.LAYERS where  owner =upper('test') ;

delete   from sde.ST_GEOMETRY_INDEX where  owner =upper('test') ;

delete   from sde.TABLE_REGISTRY where owner =upper('test') ;

delete   from sde.column_registry t where   t.owner =upper('test') ;

delete  from gdb_featuredataset t where t.owner = upper('test') ;

delete  from sde.ALL_ST_GEOMETRY_COLUMNS_V where  owner =upper('test') ;

delete   from sde.ST_GEOMETRY_COLUMNS where owner =upper('test') ;

4,執行SQL,解決問題,用arccatalog再連接配接,發現test使用者下面的所有垃圾圖層資訊都不見了。

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

問題二:解決空間資料圖層名稱已經被占用的問題

問題緣由:

我們在建立空間資料庫環境時,在拷貝空間圖層時往往發現圖層名稱被占用,(大部分情況是前面講的非法删除空間資料造成),而在arccatalog的圖層樹上面又找不到,如下所示:

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

又往往建庫時要求要用這個圖層的名稱(如:二次土地調查,建庫标準要求地類圖斑的圖層名稱必須為DLTB),這時,怎麼解決呢,難道一個圖層名稱被占用就換一台資料庫機器?

原理說明:

參考上面的内容,其實解決這個問題就是删除sde裡面的被占用的圖層名稱而已。

解決辦法:

1,  找要删除的表,參考上面的說明。

2,編寫要删除的圖層的SQL,如下所示:

delete   from sde.GDB_OBJECTCLASSES where NAME = upper('testdltb_mian') and owner =upper('test') ;

delete  from sde.GEOMETRY_COLUMNS where F_TABLE_NAME =upper('testdltb_mian') and F_table_schema =upper('test') ;

delete   from sde.GEOMETRY_COLUMNS where G_TABLE_NAME = upper('testdltb_mian') and G_table_schema =upper('test') ;

delete   from sde.gdb_usermetadata where NAME = upper('testdltb_mian') and owner =upper('test') ;

delete   from sde.LAYERS where TABLE_NAME = upper('testdltb_mian') and owner =upper('test') ;

delete   from sde.ST_GEOMETRY_INDEX where TABLE_NAME = upper('testdltb_mian')and owner =upper('test') ;

delete   from sde.TABLE_REGISTRY where TABLE_NAME = upper('testdltb_mian')and owner =upper('test') ;

delete   from sde.column_registry t where table_name = upper('testdltb_mian')and  t.owner =upper('test') ;

delete  from sde.ALL_ST_GEOMETRY_COLUMNS_V where TABLE_NAME = upper('testdltb_mian') and owner =upper('test') ;

delete   from sde.ST_GEOMETRY_COLUMNS where TABLE_NAME = upper('testdltb_mian') and owner =upper('test') ;

3,執行sql,解決問題。再次拷貝圖層如下所示:

清除arcsde空間垃圾資料以及解決sde圖層名稱被占用的問題

原文位址:http://blog.csdn.net/luowangjun/article/details/4775231 

繼續閱讀