因為對空間資料管理的不善(非法的删除、重命名等),導緻sde中存在一些垃圾資料、和圖層名稱被占用,這種問題已經有好幾個同僚問我怎麼解決了?現把這個問題已經解決了,下面将整個詳細過程寫出來,共享給碰到同樣問題的網友。
測試環境:
Oracle 10.2.0.2
Arcsde 9.3 for oracle 10gR2
Oracle使用者名:test
先用arccatalog在test使用者下面建立二個圖層,圖層名稱為:testdljx_d,testdltb_mian
問題一:清除arcsde中的空間垃圾資料
問題緣由:
用oracle管理控制台直接删除空間資料所在的使用者(也叫方案),但是在Arcsde還是能看到對應的圖層名稱,這些圖層無法浏覽,形成了垃圾資訊,并且這些垃圾圖層資訊無法删除,提示表沒有找到,怎麼去掉這些垃圾圖層資訊?
原理說明:
其實Arcsde隻是空間資料引擎,隻是作為空間資料存取的一個管道而已,不真正存放空間資料,真正的空間資料是存放在底層的關系型資料庫中的。如我用arc catalog建立了2個圖層,那麼用在對應的oracle使用者下面中找到對應的二個表。
因為關系型資料庫最底層的邏輯實體是二維表,是以一旦直接用底層oracle的管理工具(如:PLSQL、OEM)删除了存放到oracle裡面的二維表,那麼上層的arcsde就無法存取了。
雖然Arcsde隻是一個空間資料存取的管道,但是我們通路空間資料都是通過arcsde的服務來通路的,當然arcsde不是什麼都不做,arcsde主要通過自身的系統表來控制對空間資料的通路,就像oracle的system使用者一樣,系統表存放在oracle的sde使用者下面,用sde使用者登入到oracle,可以看到對應的表資訊。
系統表裡面記錄了每個空間資料的圖層名稱、空間資料的擁有者,我用arccatalog建立2個圖層(tdljx_d,testdltb_mian)時,會在sde系統表中找到對應的資訊,如下所示:
到了這裡肯定大家就知道後面怎麼解決了。無非不就是删除sde系統表下面的垃圾記錄,不就可以解決了,對的。問題是這些垃圾記錄存放在sde那些系統表下面呢?
解決過程:
1,用plsql登入到oracle中,删除剛剛建立的二個圖層testdljx_d,testdltb_mian,重制問題現象,然後用arctalog浏覽這二個圖層,發現無法浏覽。
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使用者下面的所有垃圾圖層資訊都不見了。
問題二:解決空間資料圖層名稱已經被占用的問題
問題緣由:
我們在建立空間資料庫環境時,在拷貝空間圖層時往往發現圖層名稱被占用,(大部分情況是前面講的非法删除空間資料造成),而在arccatalog的圖層樹上面又找不到,如下所示:
又往往建庫時要求要用這個圖層的名稱(如:二次土地調查,建庫标準要求地類圖斑的圖層名稱必須為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,解決問題。再次拷貝圖層如下所示:
原文位址:http://blog.csdn.net/luowangjun/article/details/4775231