虽然名称很长,但是含义并不复杂。如果一个用户中创建了有个包含映射表的索引组织表,则在删除这个用户的时候会报错。
看看具体的例子吧:
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