Невозможно удалить таблицу очереди Oracle с DBMS_AQADM.DROP_QUEUE_TABLE - PullRequest
0 голосов
/ 12 мая 2010

Я пытаюсь устранить случайную установку 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 ]

3 голосов
/ 12 мая 2010

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

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

В течение дней 9i / 10g "события alter set set '10851 контекст имени трассы навсегда, уровень 2'", за которыми следует DROP TABLE tname , используемый для иногда работа не знаю, будет ли это все еще.

1 голос
/ 24 марта 2017

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

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

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

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

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

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

0 голосов
/ 07 февраля 2013

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

0 голосов
/ 01 декабря 2010

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

...