服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

用sys执行全文索引的建立时出现权限不足

【赛迪网-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;

索引已创建。

扫描关注微信公众号