【问题标题】:Cannot drop Oracle queue table with DBMS_AQADM.DROP_QUEUE_TABLE无法使用 DBMS_AQADM.DROP_QUEUE_TABLE 删除 Oracle 队列表
【发布时间】:2010-05-12 14:48:41
【问题描述】:

我正在尝试将意外安装的 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.

我做错了什么?

【问题讨论】:

    标签: oracle plsql ora-00942


    【解决方案1】:

    您之前是否尝试过删除失败的队列表?这种孤立队列表的情况通常是由于某些问题导致在使用 AQ API 调用时引发异常。

    我不知道这是什么时候引入的,但至少 11g 现在有一个用于 drop_queue_table 调用的 FORCE 参数,该参数作为 drop table 过程的一部分停止和删除队列。在您的情况下,这可能为时已晚,但可能值得一试。

    在 9i/10g 的日子里,“alter session set events '10851 trace name context forever, level 2'”,后跟一个 DROP TABLE tname 用于有时工作 - 不知道它是否仍然有效。

    【讨论】:

    • 是的,我多次尝试通过无序发出dbms_aqadm 调用来删除队列表,但都失败了。您的 alter session 建议在 11g 上对我有用。很有帮助,谢谢。
    • 呃。我重新安装了 XE (10.2) 来解决这个问题:p 我在尝试 DROP USER <username> CASCADE 时遇到了这个问题。如果我的目标只是删除整个用户/模式,有没有更好的方法来做到这一点?
    • @Merlyn - 我不知道。如果您想使用此命令定期 DROP USER 进行重建,一种解决方案是将队列分离到单独的模式中,并对将被删除和重新创建的模式进行适当的入队/出队授权。
    • 这听起来是个不错的建议,但我想我将无法使用它。在我正在处理的项目中,很难检查对架构的更改。幸运的是,我根本不打算经常删除用户(我这样做只是因为我在构建数据库的本地开发实例时搞砸了)。似乎仍然应该有某种方法来强制擦除这样的东西,尽管我猜大多数真实用户只会保留备份。感谢您的帮助:)
    【解决方案2】:

    我使用 oracle 11g r2。下面对我来说很好。不确定是否所有版本都支持以下。

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

    上述命令会自动停止并删除相关的队列,然后删除队列表。

    如果您想自己完成所有步骤(一切手动),请按以下顺序进行:

    1. 停止关联的队列。
    2. 删除关联的队列。
    3. 删除队列表。

    我假设您将有权执行 dbms_aqadm pkg 函数,否则调用这些 pkg 将导致错误。 我希望这是有道理的。

    【讨论】:

    • 我上面的建议都经过我多次成功测试。所以,你可以相信它。
    【解决方案3】:

    Alter session set events '10851 trace name context forever, level 2

    【讨论】:

      【解决方案4】:

      给定的 Soln 在 10.2.0.3 中运行良好——我们能够删除尝试删除的模式所有者的 user_tables 中列出的队列表:在使用上面的“alter session set events”10851 跟踪名称上下文后它工作正常' .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 2016-01-20
        • 1970-01-01
        相关资源
        最近更新 更多