Oracle - 无法删除表

Posted

技术标签:

【中文标题】Oracle - 无法删除表【英文标题】:Oracle - Unable to drop tables 【发布时间】:2012-03-23 11:01:31 【问题描述】:

这个问题与one I posted yesterday 相关,但有进一步的含义。

情况是:我无法删除 ANY 表。这是一个例子:

SQL> CREATE TABLE FOO (BAR NUMBER) TABLESPACE SYSTEM
 /
Table created.

SQL> SELECT COUNT(1) FROM FOO;
  COUNT(1)
----------
         0

SQL> DROP TABLE FOO;
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-06512: at line 19

所以,该表似乎存在,但我无法删除它。

注意错误ORA-00604:递归 SQL 级别 1 发生错误。如果我尝试删除不存在的表,则不会出现此错误:

SQL> DROP TABLE NON_EXISTING_TABLE
ERROR at line 1:
ORA-00942: table or view does not exist

不知何故,系统无法在丢弃时间找到该表。

oracle 安装和数据库本身是新的(一天旧)。

编辑 - 我使用另一个表空间和用户(我刚刚创建的)重试了这个测试,我得到了一个稍微不同的行为:使用 SYS,在我得到 DROP 错误之后 我仍然可以选择强>从表。但是,使用这个新用户,在我收到 DROP 错误后,我不再可以从表中选择

解决方案

我们发现了问题:缺少 MDSYS.SDO_GEOR_SYSDATA_TABLE,阻止了删除操作。解决方案是恢复该表。这是 Gaurav Soni 提供的完整解决方案(顺便说一句,非常感谢)。

运行脚本 catmd.sql(位于 $ORACLE_HOME/md/admin 目录中)。

catmd.sql 脚本是在数据库中加载 Oracle 空间所需的所有对象的脚本。然后删除用户。

你也可以参考oracle metalinks

Steps for Manual Installation of Oracle Spatial Data Option

Dropping user results in ORA-942 against SDO_GEOM_METADATA_TABLE

【问题讨论】:

你安装了哪个oracle版本? link Oracle Database 10g Express Edition Release 10.2.0.1.0 - 生产 有点远景,但它的作用就像这里发生了其他事情。 DATABASE 或您当前的架构上是否有 DROP 触发器? 我已经检查过了,但我真的不知道如何解释。我有以下下降触发器。 SYS 上的 AW_DROP_TRG。 MDSYS 上的 SDO_DROP_USER、SDO_GEOR_DROP_USER、SDO_NETWORK_CONS_DROP_TRIG、SDO_NETWORK_DROP_USER、SDO_NETWORK_UD_DROP_TRIG。有嫌疑吗? select owner,trigger_name,trigger_type,triggering_event from dba_triggers where table_name ='FOO' AND trigger_type like '%EVENT' and triggering_event like '%DROP%' order by 1,2 /你能提供这个查询的输出吗 【参考方案1】:

我建议您激活 SQL 跟踪 (ALTER SESSION SET SQL_TRACE=TRUE;) 并再次尝试删除。这将在服务器上生成一个跟踪文件(在udump 目录中),该文件将显示会话执行的所有 SQL,包括递归语句。这应该会显示失败的递归 SQL 语句。

【讨论】:

使用您的建议和 Gaurav 的建议,我能够缩小范围:问题在于 MDSYS.SDO_GEOR_DROP_USER 触发器,最准确地说是似乎不存在的 SDO_GEOR_SYSDATA_TABLE!我试图在该表上进行选择,但得到“ORA-00942:表或视图不存在”。然后我在使用该表之前编辑了触发器以返回,现在我可以删除表。接下来,也是最后,我重新编辑了触发器以在使用该表后立即返回,我不再可以删除表。该表不存在或找不到。关于为什么的任何想法? 不知道。我相信这与甲骨文的空间选项有关,我对此没有任何经验。可能是安装过程中出现错误。如果您不使用此选项,最好将其删除。 非常感谢。我已经向我的同事询问了该表的创建脚本。现在我有了桌子,我终于可以放下桌子了。但是,我仍然很好奇这是怎么发生的。【参考方案2】:

我认为问题在于您在系统表空间上创建了表。您应该在用户表空间上创建它或创建一个来存储您的数据。

【讨论】:

正如我在问题的编辑部分所说,我尝试使用不同的用户和表空间。 我不知道这会阻止删除表的任何一般原因。我可以在SYSTEM 表空间中创建和删除表。

以上是关于Oracle - 无法删除表的主要内容,如果未能解决你的问题,请参考以下文章

oracle undo表空间被删除,数据库无法启动,请问如何恢复

Oracle 无法删除表,错误代码:ORA-00942

无法删除或截断 oracle 中的表

oracle删除用户和表空间

oracle 删除表时提示资源正忙

ORACLE日常-如何恢复oracle中误删除表(drop掉的)