5

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

典型的实现工作如下:

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

不过, Oracle 空间索引让我很伤心。

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

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

我目前的解决方案如下所示:

在 XE 上:

  • 从 mdsys.user_sdo_geom_metadata 中删除
  • 从 mdsys.sdo_index_metadata_table 删除其中 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' and object_name not like 'MDRT_%$'
  • DROP *table_name* CASCADE CONSTRAINTS PURGE /* 用于所有表 */

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

XE没有。

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

4

2 回答 2

5

我通过使用枚举所有空间索引来解决它

select INDEX_NAME from USER_SDO_INDEX_INFO

并使用 INDEX_NAME 生成 DROP 语句,如

DROP INDEX my_index
于 2011-03-17T21:33:35.163 回答
0

在 10g 上,尝试xxx_SDO_INDEX_yyy视图或寻找具有 type 的对象SPATIAL_INDEX。您可以先删除其中的每一个,然后删除表格。我不知道这些是否存在于 XE 上。

于 2010-12-31T18:05:16.200 回答