无法级联删除包含映射表的索引组织表的用户

本文探讨了在Oracle数据库中删除包含映射表的索引组织表时遇到的问题,并展示了如何通过修改表结构来避免该问题。文章还对比了不同版本间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然名称很长,但是含义并不复杂。如果一个用户中创建了有个包含映射表的索引组织表,则在删除这个用户的时候会报错。

 

 

看看具体的例子吧:

SQL> CREATE USER A IDENTIFIED BY A;

用户已创建。

SQL> GRANT CONNECT, RESOURCE TO A;

授权成功。

SQL> CONN A/A@YTK92
已连接。
SQL> CREATE TABLE T_INDEX_ORG (ID NUMBER PRIMARY KEY)
  2  ORGANIZATION INDEX
  3  MAPPING TABLE;

表已创建。

SQL> SELECT * FROM TAB;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
SYS_IOT_MAP_32364              TABLE
T_INDEX_ORG                    TABLE

SQL> CONN YANGTK/YANGTK@YTK92
已连接。
SQL> DROP USER A CASCADE;
DROP USER A CASCADE
*
第 1 行出现错误:
ORA-00604: 递归 SQL 层 1 出现错误

ORA-28668: 无法引用按索引组织的表的映射表


SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 -
Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

错误的原因很明确,问题的解决也很简单,或者直接删除包含MAPPING TABLE的索引组织表,或者去掉MAPPING TABLE:

SQL> CONN A/A@YTK92
已连接。
SQL> ALTER TABLE T_INDEX_ORG MOVE NOMAPPING;

表已更改。

SQL> SELECT * FROM TAB;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
T_INDEX_ORG                    TABLE

SQL> CONN YANGTK/YANGTK@YTK92
已连接。
SQL> DROP USER A CASCADE;

用户已删除。

在metalink的文章:Bug No. 1919577中描述了这个bug,不过Oracle似乎认为这并不是一个bug。

这个问题在9i上存在,在10203中已经解决了这个bug:

SQL> create user a identified by a;

用户已创建。

SQL> grant connect, resource to a;

授权成功。

SQL> conn a/a
已连接。
SQL> create table t_index_org (id number primary key)
  2  organization index
  3  mapping table;

表已创建。

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
SYS_IOT_MAP_128467             TABLE
T_INDEX_ORG                    TABLE

SQL> conn test/test
已连接。
SQL> drop user a cascade;

用户已删除。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值