在Oracle数据库中,SYS用户是整个数据库的所有者,SYS拥有数据库中几乎所有的权限。不过今天意外使用SYS执行全文索引的建立时,出现了权限不足的错误。
记得刚开始使用Oracle的时候,对于权限还不是很了解,如果有时候报错ORA-1031缺少足够的权限,且找不到所需要的授权的权限时,就会尝试使用SYS来执行这个错误。由于SYS时整个数据库的所有者,因此不会出现缺少权限的问题。
不过今天在测试一个全文索引例子的时候,由于忘记切换用户,使用了SYS用户执行,结果居然出现了ORA-1031错误,数据库测试版本为9204:
SQL> SHOW USERITPUB个人空间 BE+|nC6j
USER为"SYS"ITPUB个人空间^sM$JM
q9VL!t e]
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(60));
表已创建。
SQL> INSERT INTO T VALUES (1, 'A SIMPLE TEST FOR SYS CREATE CONTEXT INDEX');
已创建1行。
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;ITPUB个人空间"Eke,p4M-r2V{
CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT
?K@
P%u(J~0*ITPUB个人空间.{/^'M2M9d m0R
ERROR位于第1行:ITPUB个人空间QcH
f\;AJ2x
ORA-29855:执行ODCIINDEXCREATE例行程序时出错ITPUB个人空间%GkHA]#F[CD
ORA-20000: Oracle Text错误:ITPUB个人空间
YV%Y/q7L~$q[4J0Uy
DRG-50857: oracle error in drixtab.create_index_tablesITPUB个人空间0sI)yU;u$zL
ORA-01031:权限不足
\7jkZ6jvZ0ORA-06512:在"CTXSYS.DRUE", line 157ITPUB个人空间E5r+~Ct^"p
ORA-06512:在"CTXSYS.TEXTINDEXMETHODS", line 204
而这个例子在普通用户下并不会报错:
SQL> CONN YANGTK/YANGTK@TEST1
'~C/J%Hs%Wy0已连接。ITPUB个人空间t8@2\V*@U*M`
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(60));
表已创建。
SQL> INSERT INTO T VALUES (1, 'A SIMPLE TEST FOR SYS CREATE CONTEXT INDEX');
已创建1行。
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;
索引已创建。
通过EVENTS 10046进行跟踪,发现在创建DR$IND_T_NAME$K表的时候报错,而这个表是一个索引组织表。
根据这些信息查询了METALINK,发现Bug No. 1366361对这个问题进行了比较清晰的阐述。缺少权限的不是SYS用户,而是CTXSYS所建立的存储过程没有权限。不过文章并没有解释清楚为什么普通表没有问题,而建立一个索引组织表报错。
不过这篇文章给出了对应的解决方法,将数据库的O7_DICTIONARY_ACCESSIBILITY设置为TRUE,重起后,就不会报错了。
SQL> CONN /@TEST1 AS SYSDBAITPUB个人空间#\#?.f,_`cZ|
已连接。ITPUB个人空间a.i{g2F wh/B
SQL> SHOW PARAMETER O7
NAME TYPE VALUE
Q5ge u_ x^Y0------------------------------------ ----------- --------------------------ITPUB个人空间b"B:We5FhJ,o
O7_DICTIONARY_ACCESSIBILITY boolean FALSE
S,g2[#g:w
cI"\p0SQL> ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY = TRUE SCOPE = SPFILE;
系统已更改。
SQL> SHUTDOWN IMMEDIATE
X B{w;{0T3_0数据库已经关闭。ITPUB个人空间`2{8]-}0V'`
已经卸载数据库。
oj(WHqg1Y0ORACLE例程已经关闭。ITPUB个人空间;TX^$Ze5wL
SQL> STARTUP
\!z qgo%W1}0ORACLE例程已经启动。
Total System Global Area 110173900 bytes
.m_7[(Zi;q:sU0Fixed Size 454348 bytesITPUB个人空间%A5drV]
Variable Size 83886080 bytesITPUB个人空间 \
k8t{k
Database Buffers 25165824 bytesITPUB个人空间
f$z'l!g!YjZ&r9@
Redo Buffers 667648 bytes
SV'~:n0|`#B0数据库装载完毕。ITPUB个人空间 T0|1rH X
数据库已经打开。
下面删除刚才建立索引失败留下的垃圾表,就可以重建索引了:
SQL> DROP INDEX IND_T_NAME;
索引已丢弃。
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;
索引已创建。