Как надежно перечислить и отбросить все пространственные индексы в Oracle? - PullRequest
4 голосов
/ 28 декабря 2010

В моем проекте миграции базы данных с открытым исходным кодом Flyway у меня есть функция, которая очищает все объекты в текущей схеме базы данных, не удаляя саму схему.

Типичная реализация работает какследует:

  • Список всех объектов
  • Создание операторов отбрасывания для этих объектов

Пространственные индексы Oracle вызывают у меня многохотя скорби.

Как можно надежно перечислить их , чтобы получить операторы DROP INDEX xyz?

Примечание: Это должно работать на обоих XE, 10gи 11g .Все ссылки в схеме MDSYS должны быть удалены.

Мое текущее решение выглядит следующим образом:

На XE:

  • УДАЛИТЬ ИЗ mdsys.user_sdo_geom_metadata
  • DELETE FROM mdsys.sdo_index_metadata_table WHERE sdo_index_owner = USER
  • SELECT тип_объекта, имя_объекта FROM user_objects WHERE тип_объекта = 'TABLE'
  • DROP * имя_таблицы * / CINCAS * CURCADE1036 *

В Oracle 10g:

  • УДАЛИТЬ ИЗ mdsys.user_sdo_geom_metadata
  • ВЫБРАТЬ object_type, object_name FROM user_objects WHERE object_type = 'TABLE' и object_name_ не похож на 'MDR% $ '
  • DROP * table_name * CASCADE CONSTRAINTS PURGE / * для всех таблиц * /

10g, по-видимому, каскадно удаляет метаданные в MDSYS.sdo_index_metadata_table и удаляеттаблицы пространственных индексов (MDRT_1234 $ и т. п.).

XE не.

И 10g, и XE не каскадно удаляют метаданные в MDSYS.USER_SDO_GEOM_METADATA

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Я решил это, перечислив все пространственные индексы, используя

select INDEX_NAME from USER_SDO_INDEX_INFO

И использование INDEX_NAME для генерации операторов DROP, таких как

DROP INDEX my_index
0 голосов
/ 31 декабря 2010

на 10g, попробуйте xxx_SDO_INDEX_yyy представления или альтернативно ищите объекты с типом SPATIAL_INDEX.Вы можете сначала отбросить каждый из них, а затем бросить стол.Я не знаю, существуют ли они на XE или нет.

...