Невозможно удалить таблицу очередей Oracle с DBMS_AQADM.DROP_QUEUE_TABLE

Я пытаюсь устранить случайную установку LOG4PLSQL в неправильную (т. Е. SYS) схему. Существует таблица очередей с именем QTAB_LOG это должно уйти. Я успешно остановил и удалил связанную очередь:

call DBMS_AQADM.STOP_QUEUE('LOG_QUEUE');
call DBMS_AQADM.DROP_QUEUE('LOG_QUEUE');

Но удалить таблицу очередей не удается:

call DBMS_AQADM.DROP_QUEUE_TABLE('QTAB_LOG');

с этой ошибкой:

SQL Error: ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_AQADM", line 240
ORA-06512: at line 1
00942. 00000 -  "table or view does not exist"

И, конечно, уронить стол нормальным способом:

drop table QTAB_LOG;

не допускается:

SQL Error: ORA-24005: Inappropriate utilities used to perform DDL on AQ table LOG4PLSQL.QTAB_LOG
24005. 00000 -  "must use DBMS_AQADM.DROP_QUEUE_TABLE to drop queue tables" 
*Cause:    An attempt was made to use the SQL command DROP TABLE for queue
           tables, but DROP TABLE is not supported for queue tables.
*Action:   Use the DBMS_AQADM.DROP_QUEUE_TABLE procedure instead of the
           DROP TABLE command.

Что я делаю неправильно?

4 ответа

Решение

Были ли у вас предыдущие попытки удалить таблицу очередей, которая не удалась? Такая ситуация с таблицей потерянных очередей обычно является результатом некоторой проблемы, которая вызвала исключение, возникающее при использовании вызовов API AQ.

Я не знаю, когда это было введено, но по крайней мере 11g теперь имеет параметр FORCE для вызова drop_queue_table, который останавливает и удаляет очереди как часть процесса удаления таблицы. В вашем случае, вероятно, уже слишком поздно, чтобы это сработало, но, возможно, стоит попробовать.

В дни 9i/10g "изменения сеанса устанавливают события" 10851 контекст имени трассы навсегда, уровень 2 "", за которым следует имя DROP TABLE, которое иногда использовалось - не знаю, будет ли оно по-прежнему.

Я использую оракул 11g r2. Ниже работает нормально для меня. Не уверен, что все версии поддерживают ниже или нет.

EXEC dbms_aqadm.drop_queue_table ( queue_table => '<OWNER>.<QUEUETABLE>',force=>true);

Команда выше автоматически останавливает и удаляет связанные очереди, а затем удаляет таблицу очередей.

Если вы хотите сделать все шаги самостоятельно (все вручную), сделайте это в следующей последовательности:

  1. Остановите связанную очередь.
  2. Удалите связанную очередь.
  3. Удалить таблицу очередей.

Я предполагаю, что у вас будут права на выполнение pkg-функций dbms_aqadm, иначе вызов этих pkgs приведет к ошибке. Я надеюсь это имеет смысл.

Учитывая, что данный код работает нормально для 10.2.0.3 - мы смогли удалить таблицу очередей, указанную в user_tables владельца схемы, где была предпринята попытка удаления: она работала нормально после использования вышеупомянутого 'события alter set set' '10851 контекст имени трассировки навсегда' .

Измените сессионный набор событий '10851 контекст имени трассировки навсегда, уровень 2

Другие вопросы по тегам