如何在Oracle中可靠地列出和删除所有空间索引?

时间:2010-12-28 10:02:03

标签: sql database oracle oracle-xe oracle-spatial

在我的开源数据库迁移项目Flyway中,我有一个功能可以清除当前数据库模式中的所有对象,而不会删除模式本身。

典型的实施方法如下:

  • 列出所有对象
  • 为这些对象生成drop语句

Oracle Spatial Indexes 让我感到非常悲痛。

如何可靠地枚举以生成DROP INDEX xyz语句?

注意:这必须适用于 XE,10g和11g 。必须消除MDSYS模式中的所有引用。

我目前的解决方案如下:

在XE上:

  • 从mdsys.user_sdo_geom_metadata
  • 删除
  • 从mdsys.sdo_index_metadata_table删除WHERE sdo_index_owner = USER
  • SELECT object_type,object_name FROM user_objects WHERE object_type ='TABLE'
  • DROP * table_name * CASCADE CONSTRAINTS PURGE / *表示所有表* /

在Oracle 10g上:

  • 从mdsys.user_sdo_geom_metadata
  • 删除
  • SELECT object_type,object_name FROM user_objects WHERE object_type ='TABLE'和object_name不像'MDRT _%$'
  • DROP * table_name * CASCADE CONSTRAINTS PURGE / *表示所有表* /

10g似乎级联了MDSYS.sdo_index_metadata_table中元数据的删除以及空间索引表的删除(MDRT_1234 $等)。

XE没有。

10g和XE都没有级联删除MDSYS中的元数据.user_sdo_geom_metadata

2 个答案:

答案 0 :(得分:4)

我通过使用

枚举所有SPATIAL索引解决了这个问题
select INDEX_NAME from USER_SDO_INDEX_INFO

使用INDEX_NAME生成像

这样的DROP语句
DROP INDEX my_index

答案 1 :(得分:0)

在10g上,尝试xxx_SDO_INDEX_yyy个视图,或者查找类型为SPATIAL_INDEX的对象。你可以先放下这些,然后放下桌子。我不知道这些是否存在于XE上。