2010년 8월 25일 수요일

ArcSDE 관련 문제해결


문제발생 : 기존 사용자(아래 예에서는 BASEMAP)의 테이블스페이스, 데이터 파일, 사용자를 오라클에서 물리적으로 삭제 후 새로 BASEMAP 사용자를 생성한 상태에서 ArcCatalog 등에서 피쳐클래스 및 테이블을 업로드 할 경우 이미 테이블이 있다고 나오는 경우

 : 이는 SDE 시스템 테이블에 기존 데이터 정보가 남아 있어서 발생하는 오류이며 아래 순서대로 관련 테이블의 BASEMAP 사용자 관련 테이블 정보를 삭제하면 됨

 
1. SQL/PLUS 등에서 SDE 유저로 접속

2. SDE 시스템 테이블은 지오데이터베이스로 관리하는 GDB_*로 시작하는 테이블 및 SDE 관리테이블(LAYERS, SPATIAL_REFERENCES 등)이 있습니다.

 : 수정 대상 테이블은 다음과 같으며 하나씩 확인해 가면서 수정하세요.

 : UI 도구를 사용한다면 되도록이면 수정 전에 테이블에 어떤 내용이 들어 있는지 확인해 보세요. ArcSDE 테이블 이해에 도움이 됩니다.

: 만약 버저닝을 사용하면 더 많은 테이블이 관련되어 있습니다. 자세한 내용은 다음을 참고하세요

3. 테이블 수정 내용
▣ LAYERS
 : SELECT COUNT(*) FROM LAYERS WHERE OWNER = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM LAYERS WHERE OWNER = 'BASEMAP';
 
▣ GEOMETRY_COLUMNS
 : SELECT COUNT(*) FROM GEOMETRY_COLUMNS WHERE F_TABLE_SCHEMA = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM GEOMETRY_COLUMNS WHERE F_TABLE_SCHEMA = 'BASEMAP';

▣ COLUMN_REGISTRY
 : SELECT COUNT(*) FROM COLUMN_REGISTRY WHERE OWNER = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM COLUMN_REGISTRY WHERE OWNER = 'BASEMAP';

▣ TABLE_REGISTRY
 : SELECT COUNT(*) FROM TABLE_REGISTRY WHERE OWNER = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM TABLE_REGISTRY WHERE OWNER = 'BASEMAP';
 
▣ GDB_USERMETADATA
 : SELECT COUNT(*) FROM GDB_USERMETADATA WHERE OWNER = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM GDB_USERMETADATA WHERE OWNER = 'BASEMAP';
 
▣ GDB_FIELDINFO
 : SELECT COUNT(*) FROM GDB_FIELDINFO WHERE CLASSID IN (SELECT ID FROM GDB_OBJECTCLASSES WHERE OWNER = 'BASEMAP');
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM GDB_FIELDINFO WHERE CLASSID IN (SELECT ID FROM GDB_OBJECTCLASSES WHERE OWNER = 'BASEMAP');

▣ GDB_FEATUREDATASET
 : SELECT COUNT(*) FROM GDB_FEATUREDATASET WHERE OWNER = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM GDB_FEATUREDATASET WHERE OWNER = 'BASEMAP';

▣ GDB_FEATURECLASSES
 : SELECT COUNT(*) FROM GDB_FEATURECLASSES WHERE OBJECTCLASSID IN (SELECT ID FROM GDB_OBJECTCLASSES WHERE OWNER = 'BASEMAP');
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM GDB_FEATURECLASSES WHERE OBJECTCLASSID IN (SELECT ID FROM GDB_OBJECTCLASSES WHERE OWNER = 'BASEMAP');
 
▣ GDB_OBJECTCLASSES
 : 마지막 수정해야 할 테이블입니다.
 : SELECT COUNT(*) FROM GDB_OBJECTCLASSES WHERE OWNER = 'BASEMAP';
 : 갯수가 0개 이상이면 다음을 수행
 : DELETE FROM GDB_OBJECTCLASSES WHERE OWNER = 'BASEMAP';

마지막으로 커밋 하시면 됩니다.