Невозможно удалить таблицу очередей 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);
Команда выше автоматически останавливает и удаляет связанные очереди, а затем удаляет таблицу очередей.
Если вы хотите сделать все шаги самостоятельно (все вручную), сделайте это в следующей последовательности:
- Остановите связанную очередь.
- Удалите связанную очередь.
- Удалить таблицу очередей.
Я предполагаю, что у вас будут права на выполнение pkg-функций dbms_aqadm, иначе вызов этих pkgs приведет к ошибке. Я надеюсь это имеет смысл.
Учитывая, что данный код работает нормально для 10.2.0.3 - мы смогли удалить таблицу очередей, указанную в user_tables владельца схемы, где была предпринята попытка удаления: она работала нормально после использования вышеупомянутого 'события alter set set' '10851 контекст имени трассировки навсегда' .
Измените сессионный набор событий '10851 контекст имени трассировки навсегда, уровень 2