Не удается создать индекс Oracle Text с синхронизацией (каждый)

Я пытаюсь создать текстовый индекс Oracle для столбца CLOB в таблице, но всякий раз, когда я пытаюсь указать параметр синхронизации как «SYNC (КАЖДЫЙ» (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

person Andi Heusser    schedule 12.10.2013    source источник


Ответы (1)


Покопавшись в гугле, вот что я наконец наткнулся:

EVERY interval-string — автоматическая синхронизация индекса с регулярным интервалом, заданным значением interval-string. interval-string использует тот же синтаксис, что и для заданий планировщика. Для автоматической синхронизации с использованием EVERY необходимо, чтобы у создателя индекса были права CREATE JOB.

Взято отсюда: об Oracle Text< /а>

Я попытался запустить ваш код и получил ту же ошибку, что и вы. Однако после:

GRANT CREATE JOB TO my_user;

Я смог создать индекс без каких-либо ошибок.

person Przemyslaw Kruglej    schedule 12.10.2013
comment
Да, это помогло. Я подумал, что это должно быть какое-то отсутствующее разрешение, но просто не смог найти, какое именно. Спасибо. - person Andi Heusser; 14.10.2013