1

我正在尝试在表中的 CLOB 列上创建 Oracle 文本索引,但是每当我尝试将同步参数指定为 'SYNC (EVERY "(sysdate+30/24/60/60)")' 时,它都会失败一些关于权限不足的错误。

这些表定义为:

CREATE TABLE MESSAGE 
(
    MESSAGE_ID      NUMBER(19,0), 
    FROM            NUMBER(19,0), 
    TO              NUMBER(19,0), 
    RECEIVED_AT     TIMESTAMP (6), 
    MESSAGE_TYPE_ID NUMBER(19,0), 
    MESSAGE_DATA    CLOB, 
    IS_SEARCHABLE   CHAR(1 BYTE)
)

因此,当我尝试在 message_data 列上创建文本索引时:

BEGIN
    CTX_DDL.CREATE_PREFERENCE('msg_data_lexer', 'BASIC_LEXER');
    CTX_DDL.SET_ATTRIBUTE('msg_data_lexer', 'skipjoins', '_-');

    CTX_DDL.CREATE_PREFERENCE('msg_data_wordlist', 'BASIC_WORDLIST');
    CTX_DDL.SET_ATTRIBUTE('msg_data_wordlist', 'SUBSTRING_INDEX', 'YES');
    CTX_DDL.SET_ATTRIBUTE('msg_data_wordlist', 'PREFIX_INDEX', 'TRUE');
    CTX_DDL.SET_ATTRIBUTE('msg_data_wordlist', 'PREFIX_MIN_LENGTH', '3');
    CTX_DDL.SET_ATTRIBUTE('msg_data_wordlist', 'PREFIX_MAX_LENGTH', '6');
END;
/
CREATE INDEX message_msg_data_txt_idx on message(message_data)
    INDEXTYPE IS CTXSYS.CONTEXT
    FILTER BY message_type_id, from_entity, to_entity, is_searchable
    PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE
                 FILTER CTXSYS.NULL_FILTER
                 LEXER msg_data_lexer
                 SYNC (EVERY "SYSDATE + (30/24/60/60)")
                 WORDLIST msg_data_wordlist');

所以基本上我想创建一个每 30 秒同步一次的索引,因为这是一个将一直添加大量新消息的表(每秒可能有数百到数千条消息)。

运行创建索引时,它会输出:

Error at Command Line:1 Column:13
Error report:
SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50857: oracle error in drvddl.IndexCreate
ORA-27486: insufficient privileges
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366
29855. 00000 -  "error occurred in the execution of ODCIINDEXCREATE routine"

据我所知,用户拥有所有必要的权限。如果我删除“sync”参数或将其更改为“SYNC (ON COMMIT)”,则索引会正确创建。

为什么我不能将同步参数设置为“每个”?我究竟做错了什么?

我正在使用的 Oracle 版本是:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
4

1 回答 1

2

在通过谷歌挖掘之后,这就是我最终遇到的:

EVERY interval-string- 以 的值指定的定期间隔自动同步索引interval-stringinterval-string采用与调度程序作业相同的语法。使用自动同步EVERY需要索引创建者具有CREATE JOB权限。

取自这里:关于 Oracle Text

我尝试运行您的代码并得到与您相同的错误。但是,之后:

GRANT CREATE JOB TO my_user;

我能够创建索引而没有任何错误。

于 2013-10-12T06:20:06.207 回答