【赛迪网-it技术报道】在oracle中,sys用户是整个数据库的所有者,sys拥有数据库中几乎所有的权限。今天我们就来介绍一下使用sys执行全文索引的建立时,出现了权限不足的错误。
许多人刚刚接触oracle时,对于权限并不是很了解,如果有时候报错ora-1031缺少足够的权限,且找不到所需要的授权的权限时,就会尝试使用sys来执行这个错误。由于sys时整个数据库的所有者,因此不会出现缺少权限的问题。
下面我们来介绍一个错误案例:在测试一个全文索引例子的时候,由于忘记切换用户,使用了sys用户执行,结果出现ora-1031错误,数据库测试版本为9204:
sql> show user
user 为"sys"
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;
create index ind_t_name on t(name) indextype is ctxsys.context
*
error 位于第 1 行:
ora-29855: 执行 odciindexcreate 例行程序时出错
ora-20000: oracle text 错误:
drg-50857: oracle error in drixtab.create_index_tables
ora-01031: 权限不足
ora-06512: 在"ctxsys.drue", line 157
ora-06512: 在"ctxsys.textindexmethods", line 204
注意:这个例子在普通用户下并不会报错:
sql> conn yangtk/yangtk@test1已连接。
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 sysdba已连接。
sql> show parameter o7
name type value
------------------------------------ ----------- --------------------------
o7_dictionary_accessibility boolean false
sql> alter system set o7_dictionary_accessibility = true scope = spfile;
系统已更改。
sql> shutdown immediate数据库已经关闭。已经卸载数据库。
oracle 例程已经关闭。
sql> startup
oracle 例程已经启动。
total system global area 110173900 bytes
fixed size 454348 bytes
variable size 83886080 bytes
database buffers 25165824 bytes
redo buffers 667648 bytes数据库装载完毕。数据库已经打开。
最后删除刚才建立索引失败留下的垃圾表,就可以重建索引了:
sql> drop index ind_t_name;
索引已丢弃。
sql> create index ind_t_name on t(name) indextype is ctxsys.context;
索引已创建。
闽公网安备 35060202000074号