在我的开源数据库迁移项目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 中的元数据