我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

SYS执行SQL报错缺少权限

上一篇 / 下一篇  2008-03-15 23:56:23 / 个人分类:ORACLE

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个人空间.{/^'M2M9dm0R
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
Q5g e 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
XB{w;{0T3_0
数据库已经关闭。ITPUB个人空间`2{8]-}0V'`
已经卸载数据库。
oj(WHqg1Y0ORACLE
例程已经关闭。ITPUB个人空间;TX^$Ze5wL
SQL> STARTUP
\!zqgo%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;

索引已创建。

 

 


TAG:

yangtingkun的个人空间 引用 删除 yangtingkun   /   2008-03-16 21:32:47
文章中已经说明了,是9204。

应该是920和以前版本都存在这个问题。
引用 删除 jidongzheng   /   2008-03-16 10:00:23
哈哈。我也测试了下。数据库版本:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SYS


SQL> disc
Not logged on

SQL> conn sys/sysdba as sysdba
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as SYS

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(60));

Table created

SQL>  INSERT INTO T VALUES (1, 'A SIMPLE TEST FOR SYS CREATE CONTEXT INDEX');

1 row inserted

SQL> commit;

Commit complete
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;

Index created

SQL>
SQL> commit;

Commit complete



SQL> select * from t where contains(name,'test') > 0;

        ID NAME
---------- ------------------------------------------------------------
         1 A SIMPLE TEST FOR SYS CREATE CONTEXT INDEX

查询也没有问题。

不知道楼主的是什么具体版本
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar