Oracle Text 所需的權限
我是 Oracle Text 的新手,我正在使用它來支持我編寫的應用程序中的搜尋功能。一切似乎都正常工作,除了我對必須在 ctxsys 模式中儲存一堆東西以解決權限不足問題這一事實不滿意。(這適用於 Oracle 10gR2)。
這是我必須為我的應用程序設置 Oracle Text 的 SQL 腳本
-- Since the CTXSYS schema was created when Oracle Text was installed -- it does not yet have permission to select on certain tables it needs to -- for the below procedure grant select on dmg.table1 to CTXSYS; grant select on dmg.table2 to CTXSYS; grant select on dmg.table3 to CTXSYS; grant select on dmg.table4 to CTXSYS; grant select on dmg.table5 to CTXSYS; create or replace procedure ctxsys.attr_indexing_procedure ( rid in rowid, tlob in out NOCOPY clob ) is begin -- This procedure queries the above five tables to extract text and combine it into a single document placed into tlob end; / begin ctx_ddl.create_preference('dmg.my_datastore', 'user_datastore' ); ctx_ddl.set_attribute( 'dmg.my_datastore', 'procedure', 'CTXSYS.attr_indexing_procedure' ); end; / begin ctx_ddl.create_preference( 'dmg.my_index_lexer', 'BASIC_LEXER' ); ctx_ddl.set_attribute( 'dmg.my_index_lexer', 'base_letter', 'YES'); end; / begin ctx_ddl.create_preference('dmg.MY_STEM_FUZZY_PREF', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','STEMMER','ENGLISH'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','FUZZY_MATCH','ENGLISH'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','FUZZY_SCORE','0'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','FUZZY_NUMRESULTS','5000'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','SUBSTRING_INDEX','TRUE'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','PREFIX_INDEX','TRUE'); ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','WILDCARD_MAXTERMS','5000'); end; / -- I would prefer that this index be owned by dmg but it looks like that would require the create any table privilege on dmg (because oracle text -- will create tables in the ctxsys schema when creating the index). Therefore, ctxsys will own the text index. create index ctxsys.ix_doi_attr on table1(column1) indextype is ctxsys.context parameters( 'datastore dmg.my_datastore lexer dmg.my_index_lexer wordlist dmg.DOI_STEM_FUZZY_PREF'); -- Schedule the index to sync every 4 hours declare job_num number; nlsvar varchar2(4000); envvar raw(32); begin select nls_env,misc_env into nlsvar,envvar from dba_jobs where rownum<2 and nls_env is not null and misc_env is not null; select max(job)+1 into job_num from dba_jobs; sys.dbms_ijob.submit(job=>job_num, luser=>'CTXSYS', puser=>'CTXSYS', cuser=>'CTXSYS', what=>'ctx_ddl.sync_index(''ctxsys.ix_doi_attr'');', next_date=>sysdate+1/1440, interval=>'SYSDATE+240/1440', broken=>false, nlsenv=>nlsvar, env=>envvar); commit; dbms_output.put_line('job '||job_num||' has been submitted.'); end; /
此腳本旨在由我的個人使用者執行,該使用者具有 DBA 角色。所有相關表都歸“DMG”模式所有,它的權限非常有限。
如您所見,我正在使用 user_datastore 將多個表中的文本聚合到一個文件中。此外,如果索引過程、索引本身和定期同步索引的 dmbs_job 都歸 ctxsys 所有,我只能完成這項工作,這似乎是個壞主意。最好,我希望所有東西都歸 DMG 模式所有。
我遇到的最大問題是在創建索引語句中。它總是會失敗
SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine ORA-20000: Oracle Text error: DRG-50857: oracle error in drvxtab.create_index_tables ORA-01031: insufficient privileges ORA-06512: at "CTXSYS.DRUE", line 160 ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 364 29855. 00000 - "error occurred in the execution of ODCIINDEXCREATE routine" *Cause: Failed to successfully execute the ODCIIndexCreate routine. *Action: Check to see if the routine has been coded correctly.
DR$IX_DOI_ATTR$I
經過一番探勘,我發現 create index 語句試圖在名為、DR$IX_DOI_ATTR$K
、DR$IX_DOI_ATTR$N
、DR$IX_DOI_ATTR$P
和的 ctxsys 模式下創建一些表DR$IX_DOI_ATTR$R
。我發現如果我賦予 DMG 模式CREATE ANY TABLE
特權,它可以創建索引,但這不是我想要在生產中做的事情。我怎樣才能讓 DMG 架構擁有所有東西(即我需要授予 DMG 架構的最低權限)?有沒有辦法讓我刪除 dmg 表上對 ctxsys 的授權?
編輯:
我最初說賦予 DMG 模式
CREATE ANY TABLE
特權有效是不正確的。而是將錯誤消息更改為:SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine ORA-20000: Oracle Text error: DRG-50857: oracle error in drvxtab.create_index_tables ORA-01536: space quota exceeded for tablespace 'DMG' ORA-06512: at "CTXSYS.DRUE", line 160 ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 364 29855. 00000 - "error occurred in the execution of ODCIINDEXCREATE routine" *Cause: Failed to successfully execute the ODCIIndexCreate routine. *Action: Check to see if the routine has been coded correctly.
這是一條非常奇怪的消息,因為在該數據庫的任何地方都沒有設置配額。我不知道它是如何達到配額限制的。
我最終做的是在創建索引之前授予 DMG 模式 DBA 訪問權限,然後立即撤銷它。我擔心這會導致索引無法同步,但它似乎工作得很好。我能夠將所有內容移入 DMG 架構 = 並刪除對 ctxsys 架構的初始授權。
我仍然不清楚我需要哪些特定權限來授予 DMG 架構,但我解決了我的問題。
上下文表是在使用者中使用 PL/SQL 包創建的。
您需要授予
create table
使用者,並為使用者的預設表空間配額。無需 DBA,只需執行
select 'alter user ' || USERNAME || ' quota unlimited on ' || DEFAULT_TABLESPACE ||';' from dba_users where USERNAME = 'DMG';
上述 SQL 將生成 SQL 以在使用者的預設表空間上授予無限配額。執行輸出,然後確保使用者有
create table
權限,比如grant create table to DMG;